PACT .NET 消费者测试:灵活的长度数组
PACT .NET consumer test: flexible length array
我正在使用 pactNet 测试一个 API 应该 return 一个灵活长度的数组。
如果我调用 "myApi/items/" 它应该 return 一个消费者不知道其确切大小的项目列表。
所以答案应该是这样的:
[
{
"id": "1",
"description": "foo"
},
{
"id": "2",
"description": "foo2"
},
{
"id": "3",
"description": "foo3"
}
]
或者这个:
[
{
"id": "4",
"description": "foo4"
},
{
"id": "2",
"description": "foo2"
}
]
如何为该交互创建合同?
documentation 中是 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>
{
{ "Accept", "application/json" }
}
})
.WillRespondWith(new ProviderServiceResponse
{
Status = 200,
Headers = new Dictionary<string, object>
{
{ "Content-Type", "application/json; charset=utf-8" }
},
Body = // array of items with some attributes
// (somthing like: {"id": "2", "description": "foo"})
// with flexible length
});
var consumer = new ItemApiClient(_mockProviderServiceBaseUri);
//Act
var result = consumer.GetItems();
//Assert
Assert.AreEqual(true, result.Count > 0);
_mockProviderService.VerifyInteractions();
data.Dispose();
}
听起来您正在寻找 MinTypeMatcher。
正文部分如下所示:
Body = Match.MinType(new { id: "1", description: "foo" }, 1)
那么,如果我想匹配具有 属性 列表或数组的对象类型怎么办?
如果你执行 Match.Type(new myType()) 并且数组或列表中的元素数量 属性 不完全相同,测试将失败。您将看到这样的错误:
Description of differences
--------------------------------------
* Actual array is too long and should not contain a Hash at $.data.itinerary[2]
对于像@SlimSjakie 询问的嵌套数组场景,只需在具有数组的 属性 处重复 Match.MinType。例如,下面的 Person 对象将地址 属性 作为数组。
Person = Match.MinType(new
{
FirstName = Match.Type("string"),
LastName = Match.Type("string"),
Address = Match.MinType(new
{
Street = Match.Type("string"),
Town = Match.Type("string"),
State = Match.Type("string"),
Postcode = Match.Type("string"),
Country = Match.Type("string")
}, 1)
}, 1)
我正在使用 pactNet 测试一个 API 应该 return 一个灵活长度的数组。
如果我调用 "myApi/items/" 它应该 return 一个消费者不知道其确切大小的项目列表。 所以答案应该是这样的:
[
{
"id": "1",
"description": "foo"
},
{
"id": "2",
"description": "foo2"
},
{
"id": "3",
"description": "foo3"
}
]
或者这个:
[
{
"id": "4",
"description": "foo4"
},
{
"id": "2",
"description": "foo2"
}
]
如何为该交互创建合同?
documentation 中是 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>
{
{ "Accept", "application/json" }
}
})
.WillRespondWith(new ProviderServiceResponse
{
Status = 200,
Headers = new Dictionary<string, object>
{
{ "Content-Type", "application/json; charset=utf-8" }
},
Body = // array of items with some attributes
// (somthing like: {"id": "2", "description": "foo"})
// with flexible length
});
var consumer = new ItemApiClient(_mockProviderServiceBaseUri);
//Act
var result = consumer.GetItems();
//Assert
Assert.AreEqual(true, result.Count > 0);
_mockProviderService.VerifyInteractions();
data.Dispose();
}
听起来您正在寻找 MinTypeMatcher。
正文部分如下所示:
Body = Match.MinType(new { id: "1", description: "foo" }, 1)
那么,如果我想匹配具有 属性 列表或数组的对象类型怎么办?
如果你执行 Match.Type(new myType()) 并且数组或列表中的元素数量 属性 不完全相同,测试将失败。您将看到这样的错误:
Description of differences
--------------------------------------
* Actual array is too long and should not contain a Hash at $.data.itinerary[2]
对于像@SlimSjakie 询问的嵌套数组场景,只需在具有数组的 属性 处重复 Match.MinType。例如,下面的 Person 对象将地址 属性 作为数组。
Person = Match.MinType(new
{
FirstName = Match.Type("string"),
LastName = Match.Type("string"),
Address = Match.MinType(new
{
Street = Match.Type("string"),
Town = Match.Type("string"),
State = Match.Type("string"),
Postcode = Match.Type("string"),
Country = Match.Type("string")
}, 1)
}, 1)