如何断言从BDD测试发送到restful web服务的请求(带有nunit的specflow)

如何断言从BDD测试发送到restful web服务的请求(带有nunit的specflow),rest,bdd,webrequest,specflow,intercept,Rest,Bdd,Webrequest,Specflow,Intercept,我正在为客户的新需求编写一个BDD风格的测试 只是给出一个被测试系统的背景。我们有一个正在侦听TCP端口的windows服务。此windows服务负责处理客户端在端口上发送的消息并响应客户端 处理涉及 1) 根据请求查找正确的消息处理器 2) 然后格式化第三方服务可以理解的请求 3) 将格式化的请求发送到第三方Restful web服务 4) 重新格式化从web服务获得的响应,并将其发送到客户端套接字 出于BDD的目的,我们创建了一个自托管的mock-restful服务,该服务将根据为每个请求配

我正在为客户的新需求编写一个BDD风格的测试

只是给出一个被测试系统的背景。我们有一个正在侦听TCP端口的windows服务。此windows服务负责处理客户端在端口上发送的消息并响应客户端

处理涉及

1) 根据请求查找正确的消息处理器
2) 然后格式化第三方服务可以理解的请求
3) 将格式化的请求发送到第三方Restful web服务
4) 重新格式化从web服务获得的响应,并将其发送到客户端套接字

出于BDD的目的,我们创建了一个自托管的mock-restful服务,该服务将根据为每个请求配置的消息发送响应

到目前为止,我们所有的测试都是基于发送到端口的内容以及在端口中得到的响应。通过这种方法,我们能够涵盖BDD测试中的所有功能

现在新的要求是,如果客户机在消息体中发送一个额外的元素,那么第三方服务也应该获得该额外的元素。如果客户端没有在消息体中发送额外的元素,那么我们甚至不应该将该元素发送给第三方服务。我们已经完成了这个更改(使用ShouldSerialize方法更新了POCO请求类),还使用日志文件测试了结果

但我们正在努力从BDD测试中涵盖这一点。这是因为我们的测试充当客户机并在端口上发布消息,因为我们只能控制从我们仅断言响应的端口接收的响应。我们无法控制第三方服务调用,因为这发生在windows服务生产代码中

是否有任何方法可以截获从测试发送到RESTfulWeb服务的请求,以断言该请求,以检查该请求是否按预期格式化


注意:我们正在使用C#,specflow和Nunit。

我认为您唯一的选择是能够使用存根第三方服务运行测试,然后您可以查询以检查是否正确调用了该服务


您可能能够创建一个测试代理服务,该服务将调用记录在某个地方,供您进行测试以进行检查,然后调用实际的服务。您可能可以在初始服务中使用一个简单的装饰器。

似乎您有一个中间件需要进行自己的测试:

{Your Application} --> {Middleware} --> {3rd Party Service}
                                                 |
{Your Application} <-- {Middleware} <------------+
{Your Application}-->{Middleware}-->{3rd Party Service}
|

{您的应用程序}您是否试图通过BDD测试来描述您的API以获取某种类型的文档?或许以下文章会有所帮助:

你好,山姆,谢谢你的建议。目前,我正在将请求写入模拟restful web服务中的日志文件。但是没有找到一个更干净的解决方案来获取测试中的信息。嗨,格雷格,谢谢。它几乎接近我目前正在做的事情。我有一个单元测试,它涵盖了这个功能,但不在BDD测试中。你能澄清你的观点吗。我无法从BDD为第一个点编写测试,因为我只能控制向端口写入请求并在端口上断言响应。有了这个限制,我无法从BDD测试中判断我的应用程序(在本例中是一个测试)和中间件是否能够很好地满足这个特定需求。从技术角度来看,单元测试和BDD框架是否非常相似。您可以在这两种类型的测试方法中从被测系统调用类。因此,您应该能够在bdd测试中使用单元测试中的基础结构来完成检查请求格式的目标。现在通过向虚拟restfull服务添加一些testhelper方法来解决此问题。并将虚拟restfull服务的ServiceBehavior InstanceContextMode设置为InstanceContextMode.Single。每当虚拟服务收到请求时,它都会将请求存储在一个私有变量中,并在一个testhelper方法中返回请求。在将字节发布到TCP之后的测试中,我们使用RestClient连接到服务,然后调用helper方法来检查服务接收到的请求是什么,并根据我们的期望断言它。