首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何断言API响应具有特定的结构?

如何断言API响应具有特定的结构?
EN

Stack Overflow用户
提问于 2021-01-19 19:06:38
回答 2查看 671关注 0票数 0

我已经设置了一个SpecFlow测试定义,在这里我要断言响应中有一个特定的字段集合。例如,我有一个来自API的特定预期响应:

代码语言:javascript
代码运行次数:0
运行
复制
{
    isActive: false,
    lastProcessed: "2020-11-03T19:03:16.537"

}

我要验证的是,响应包含这两个字段,而不一定包含这些字段的值。我尝试了以下方法:

代码语言:javascript
代码运行次数:0
运行
复制
Assert.NotNull(response.Model.isActive);
Assert.NotNull(response.Model.lastProcessed);

但我使用以下方法时出错了:Do not use Assert.NotNull() on value type 'bool'

否则,除了使用"NotNull()“之外,如何确保响应结构与预期的一样?

:在接受的答案之后,我将从API调用返回的模型序列化为JSON,并将其解析为JObject。然后,我使用ContainsKey()方法来断言它。

代码语言:javascript
代码运行次数:0
运行
复制
JObject jObject = JObject.Parse(JsonConvert.SerializeObject(response.Model));
Assert.True(jObject.ContainsKey("isActive"));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-19 19:36:12

我不知道用于发送请求和反序列化的包是什么,但是如果可以将响应内容作为原始的json字符串,那么可以使用Newtonsoft.JSON将响应解析为带有JObject.Parse(responseContent)JObjectJObject有一个名为ContainsKey(propertyName)的方法,它确定对象中是否存在指定名称的字段。如果对所需的属性名返回true,则可以断言。

编辑

关于格雷格下面的答案。实际上,最初的错误是由bool不是可空类型引起的,使其在模型中为空将修复错误。然而,这一解决方案并不理想。在某些情况下,null可以是API返回的有效值,这将生成假否定。如果我们收到:

代码语言:javascript
代码运行次数:0
运行
复制
{
    isActive: null,
    lastProcessed: "2020-11-03T19:03:16.537"
}

然后,即使json中存在字段,Assert.NotNull(response.Model.isActive)也会产生一个负测试结果,这正是我们想要检查的。

因此,从理论上讲,如果我们100%肯定API本身永远不会返回null,那么我们可以这样做,但它不是一个通用的方法。对我们正在努力实现的目标也没有很好的描述;)

票数 2
EN

Stack Overflow用户

发布于 2021-01-19 20:13:56

因为isActive属性是一个bool,所以您需要断言它是false。如果您想要一个真或假值,然后表示它缺少的东西,那么在DTO中使用一个可空的布尔值:

代码语言:javascript
代码运行次数:0
运行
复制
public class YourDTO
{
    public bool? isActive { get; set; }
    ...
}

然后您可以断言isActive为空、真或假。

Alternative:如果您不能更新原始数据传输对象,那么这可能是编写您自己的代码以调用web服务并将JSON响应映射到仅用于测试的JSON响应的一个很好的用例。

然而,这可能是一项大量的工作。其优点是您的测试代码能够真正地与它测试的代码分离。我也在使用数据库的应用程序中这样做过。这是额外的工作,但它允许您的测试使用对测试有意义的任何数据结构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65797890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档