我对一些发送SMS消息的代码进行了集成测试。
测试发送初始消息,比如"Hello,world",并使用VCR验证对外部SMS提供商的调用是通过HTTP API进行的。
然后,该测试模拟通过控制器发送对SMS消息的回复。
当收到无法辨认的回复时,代码是发送一条消息,比如"对不起。不计算。"然后重新发送"你好,世界。"
测试寻找发送"对不起…"的呼叫,然后寻找重新发送"你好,世界"的呼叫
然而,第二个"Hello,world"似乎没有被代码重新发送,但测试认为是这样,因为第二个expect a_request
没有失败。
我使用自定义match_requests_on: [:uri, :method]
来匹配method
和uri
。既然第一个"你好,世界"和第二个基本相同,这条规则会产生我的假阳性吗?我关闭了重复,所以我希望两个单独的请求必须在磁带中,否则测试将失败。
我错过了什么?
您可以查看以下内容。
-
我认为没有提出录像机的例外情况是个问题。您是否使用任何异步库(例如Celluloid、ruby线程、delayed_job)进行并发或后台作业?一定有什么东西通过打印异常来捕获和处理异常,这可以解释为什么会看到它,但它不会报告给rspec。
-
您的vcr.log确实包含2个与twilio的Message.json的交互,这意味着使用
:allow_playback_repeats => false
(默认值),vcr将两次响应此方法/URI。[post https://SomeUUID:SomeSecretKey@api.twilio.com/2010-04-01/Accounts/SomeUUID/Messages.json] => [201 "{"sid": "SMea17b16d31d34ce9b9ad8c6e68987b31", "date_created": "Tue, 22 Dec 2015 "], [post https://SomeUUID:SomeSecretKey@api.twilio.com/2010-04-01/Accounts/SomeUUID/Messages.json] => [201 "{"sid": "SM29ac83b5e668432e901dd75cba7bc674", "date_created": "Tue, 22 Dec 2015 "]
注意:使用
:record => :once
,VCR将记录您所做的尽可能多的交互/请求,然后将磁带冻结为只读。 -
在vcr.log中搜索
[Cassette: 'cms/sms_08'] Initialized with options
。您会注意到磁带被加载了两次(即两次测试)。然后搜索for [post https://SomeUUID:SomeSecretKey
。您会注意到,在第一个请求中,有两个Message.json请求,这两个请求都得到了成功的服务。在第二个测试中,会发出第三个请求,webmock将其标识为未处理,从而导致您看到的异常。 -
你说你在用
expect a_request
。您是否将其与.twice
一起使用来指定次数?https://github.com/bblimke/webmock#setting-rspec对webmock模块的期望