2016-05-12 15 views
1

Ich teste Mikro-Dienste und ich verwende PactNet, um Pakte zu erstellen und zu validieren. Ich stelle fest, dass die Tests zu spröde sind, da der Verifizierer nach genauen Werten sucht und die Typen nicht überprüft.Validieren Sie Typen in PactNet

Zum Beispiel teste ich gegen die GitHub API und der Test funktioniert. Wenn ein neuer Repo hinzugefügt wird, erhöht sich der Wert public_repos um eins und der Test schlägt fehl.

Verwendet jemand dies, um die Typen anstelle der konkreten Werte zu überprüfen? Hier

ist der Verifizierungscode:

[Test] 
public void VerifyPact() 
{ 

    // Arrange. 
    var pactVerifier = new PactVerifier(() => { },() => { }); 
    pactVerifier.ProviderState("There is call with the name 'karlgjertsen'"); 

    // Act. 
    using (var client = new HttpClient { BaseAddress = new Uri("https://api.github.com/users/karlgjertsen") }) 
    { 

     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); 

     // Assert. 
     pactVerifier 
      .ServiceProvider("GitHub API", client) 
      .HonoursPactWith("Pact Test") 
      .PactUri(@"C:\Pact\pacts\pact_test-git_api.json") 
      .Verify(); 

    } 

} 

Und hier ist die PACT-Datei.

{ 
    "provider": { 
    "name": "GitHub API" 
    }, 
    "consumer": { 
    "name": "PACT Test" 
    }, 
    "interactions": [ 
    { 
     "description": "A GET request for user deatils for 'karlgjertsen'", 
     "provider_state": "There is call with the name 'karlgjertsen'", 
     "request": { 
     "method": "get", 
     "path": "https://stackoverflow.com/users/karlgjertsen", 
     "headers": { 
      "Accept": "application/json" 
     } 
     }, 
     "response": { 
     "status": 200, 
     "headers": { 
      "Content-Type": "application/json; charset=utf-8" 
     }, 
     "body": { 
      "login": "karlgjertsen", 
      "id": 4457667, 
      "avatar_url": "https://avatars.githubusercontent.com/u/4457667?v=3", 
      "gravatar_id": "", 
      "url": "https://api.github.com/users/karlgjertsen", 
      "html_url": "https://github.com/karlgjertsen", 
      "followers_url": "https://api.github.com/users/karlgjertsen/followers", 
      "following_url": "https://api.github.com/users/karlgjertsen/following{/other_user}", 
      "gists_url": "https://api.github.com/users/karlgjertsen/gists{/gist_id}", 
      "starred_url": "https://api.github.com/users/karlgjertsen/starred{/owner}{/repo}", 
      "subscriptions_url": "https://api.github.com/users/karlgjertsen/subscriptions", 
      "organizations_url": "https://api.github.com/users/karlgjertsen/orgs", 
      "repos_url": "https://api.github.com/users/karlgjertsen/repos", 
      "events_url": "https://api.github.com/users/karlgjertsen/events{/privacy}", 
      "received_events_url": "https://api.github.com/users/karlgjertsen/received_events", 
      "type": "User", 
      "site_admin": false, 
      "name": "Karl Gjertsen", 
      "company": "infiniforms.io", 
      "blog": "http://www.karlgjertsen.com", 
      "location": "UK", 
      "email": null, 
      "hireable": null, 
      "bio": null, 
      "public_repos": 1, 
      "public_gists": 0, 
      "followers": 0, 
      "following": 0, 
      "created_at": "2013-05-17T14:05:30Z", 
      "updated_at": "2016-03-07T19:39:58Z" 
     } 
     } 
    } 
    ], 
    "metadata": { 
    "pactSpecificationVersion": "1.1.0" 
    } 
} 

Antwort

1

Es scheint, dass v1 des Paktes alle über das Testen Anbieter ist, wo Sie den Zustand steuern kann und das System in einem deterministischen Zustand versetzt.

v2 zielt darauf ab, mit den von Ihnen genannten Szenarien zu arbeiten.

Zu diesem Zeitpunkt unterstützt PactNet v2 nicht von Pact specification.

0

PactNet v2 unterstützt bereits type and regex matching:

Typ Anpassung für den ganzen Körper:

// IMockProviderService 
.WillRespondWith(new ProviderServiceResponse 
{ 
    Body = Match.Type(new { Id = 123, FirstName = "John" }) 
}); 

oder für eine Eigenschaft:

.WillRespondWith(new ProviderServiceResponse 
{ 
    Body = new { Id = 123, FirstName = Match.Type("John") } 
}); 

Regex Matching:

.WillRespondWith(new ProviderServiceResponse 
{ 
    Body = new { FirstName = Match.Regex("Jan", @"\A\w+\z") } 
}); 

Es gibt auch Match.MinType für Arrays.