自定义匹配器或match_requests_on是否重写播放重复?

时间:2015-12-22 17:18:12

标签: rspec3 vcr webmock

我对一些发送短信的代码进行了集成测试。

测试发送初始消息,例如“Hello,world”,并使用VCR验证通过HTTP API对外部SMS提供程序的调用。

然后,测试模拟通过控制器发送对SMS消息的回复。

在获得难以理解的回复时,代码将发送诸如“抱歉。不计算”之类的消息。然后重新发送“Hello,world”。

测试查找发送“抱歉...”的调用,然后查找重新发送“Hello,world”的调用。

然而,似乎第二个“Hello,world”没有被代码重新发送,但测试认为是,因为第二个expect a_request没有失败。

我使用自定义match_requests_on: [:uri, :method]来匹配methoduri。由于第一个“Hello,world”和第二个基本相同,这个规则是否会产生我的误报?我重复关闭,所以我希望有两个单独的请求必须在录音带中,否则测试会失败。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

你可以看几件事。

  1. 我认为没有引发VCR异常是一个问题。您是否使用任何异步库(例如Celluloid,ruby线程,delayed_job)进行并发或后台作业?必须通过打印来捕捉和处理异常,这可以解释为什么你会看到它,但它没有报告给rspec。

  2. 您的vcr.log确实包含与twilio的Message.json的2次交互,这意味着使用: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会记录您所做的任意数量的互动/请求,然后将以只读方式冻结磁带。

  3. 在vcr.log中搜索[Cassette: 'cms/sms_08'] Initialized with options。您会注意到磁带被装载两次(即进行两次测试)。然后搜索for [post https://SomeUUID:SomeSecretKey。您会注意到,在第一个中,有两个Message.json请求,这两个请求都成功提供。在第二个测试中,发出第3个请求,webmock将其标识为未处理,导致您看到的异常。

  4. 您说您正在使用expect a_request。您是否在.twice中使用它来指定多少次? https://github.com/bblimke/webmock#setting-expectations-in-rspec-on-webmock-module