我对是否应该考虑某种类型的测试功能或合同有疑问。
假设我有一个像 /getToolType 这样的 API,它接受一个 {object" "myObject"} 作为输入,并以 {type: "[az]+"} 的形式返回 type
客户端和服务器之间一致认为返回的类型将匹配一组字符串,比如 [hammer|knife|screwdriver],所以消费者决定在枚举中解析它们,当返回的类型未知时使用回退值。
消费者是否应该为每种类型(锤子、刀子、螺丝刀)包含一个测试用例,以确保生产者仍然遵守它总是返回的协议,例如,当使用锤子对象调用 /getToolType 时,小写字符串“hammer” ? 或者你会认为这样的测试用例是功能性的吗?为什么?
我正在使用 pactNet 来测试一个 API,它应该返回一个灵活长度的数组。
如果我调用“myApi/items/”,它应该返回一个消费者不知道确切尺寸的项目列表。所以答案应该是这样的:
[
{
"id": "1",
"description": "foo"
},
{
"id": "2",
"description": "foo2"
},
{
"id": "3",
"description": "foo3"
}
]
Run Code Online (Sandbox Code Playgroud)
或这个:
[
{
"id": "4",
"description": "foo4"
},
{
"id": "2",
"description": "foo2"
}
]
Run Code Online (Sandbox Code Playgroud)
如何为此交互创建合同?
在文档是在Ruby中的例子,但是我无法找到C#中的等价物。
我正在使用 pactNet 2.1.1 版。
编辑:这是一个示例,它应该是什么样子。我想知道的是如何声明主体应该包含一个长度灵活的项目数组。
[Test]
public void GetAllItems()
{
//Arrange
_mockProviderService
.Given("There are items")
.UponReceiving("A GET request to retrieve the items")
.With(new ProviderServiceRequest
{
Method = HttpVerb.Get,
Path = "/items/",
Headers = new Dictionary<string, object> …Run Code Online (Sandbox Code Playgroud) 我正在测试微服务,并使用PactNet来创建和验证契约。我发现测试太脆弱,因为验证者正在检查确切的值而不是验证类型。
例如,我正在针对 GitHub API 进行测试并且测试有效。如果添加新的Repo,则该public_repos值加一,测试失败。
有人用它来检查类型而不是具体值吗?
这是验证码:
[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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是 …