我已经设置了一个SpecFlow测试定义,在这里我要断言响应中有一个特定的字段集合。例如,我有一个来自API的特定预期响应:
{
isActive: false,
lastProcessed: "2020-11-03T19:03:16.537"
}
我要验证的是,响应包含这两个字段,而不一定包含这些字段的值。我尝试了以下方法:
Assert.NotNull(response.Model.isActive);
Assert.NotNull(response.Model.lastProcessed);
但我使用以下方法时出错了:Do not use Assert.NotNull() on value type 'bool'
否则,除了使用"NotNull()“之外,如何确保响应结构与预期的一样?
:在接受的答案之后,我将从API调用返回的模型序列化为JSON,并将其解析为JObject。然后,我使用ContainsKey()方法来断言它。
JObject jObject = JObject.Parse(JsonConvert.SerializeObject(response.Model));
Assert.True(jObject.ContainsKey("isActive"));
发布于 2021-01-19 11:36:12
我不知道用于发送请求和反序列化的包是什么,但是如果可以将响应内容作为原始的json字符串,那么可以使用Newtonsoft.JSON将响应解析为带有JObject.Parse(responseContent)
的JObject
。JObject
有一个名为ContainsKey(propertyName)
的方法,它确定对象中是否存在指定名称的字段。如果对所需的属性名返回true,则可以断言。
编辑
关于格雷格下面的答案。实际上,最初的错误是由bool
不是可空类型引起的,使其在模型中为空将修复错误。然而,这一解决方案并不理想。在某些情况下,null
可以是API返回的有效值,这将生成假否定。如果我们收到:
{
isActive: null,
lastProcessed: "2020-11-03T19:03:16.537"
}
然后,即使json中存在字段,Assert.NotNull(response.Model.isActive)
也会产生一个负测试结果,这正是我们想要检查的。
因此,从理论上讲,如果我们100%肯定API本身永远不会返回null
,那么我们可以这样做,但它不是一个通用的方法。对我们正在努力实现的目标也没有很好的描述;)
发布于 2021-01-19 12:13:56
因为isActive
属性是一个bool
,所以您需要断言它是false。如果您想要一个真或假值,然后表示它缺少的东西,那么在DTO中使用一个可空的布尔值:
public class YourDTO
{
public bool? isActive { get; set; }
...
}
然后您可以断言isActive
为空、真或假。
Alternative:如果您不能更新原始数据传输对象,那么这可能是编写您自己的代码以调用web服务并将JSON响应映射到仅用于测试的JSON响应的一个很好的用例。
然而,这可能是一项大量的工作。其优点是您的测试代码能够真正地与它测试的代码分离。我也在使用数据库的应用程序中这样做过。这是额外的工作,但它允许您的测试使用对测试有意义的任何数据结构。
https://stackoverflow.com/questions/65797890
复制相似问题