如何在域或方法之后存根请求?

时间:2016-05-23 07:00:34

标签: ruby-on-rails ruby rspec webmock

config.before(:each) do
  stub_request(:post, "https://api.3rdpartysmsprovider.com/send.php?body=This%20is%20a%20test%20message&destination=60123456789&dlr='1'&output=json&password=0000000&reference=#{@text.sms_uid}&sender=silver&username=0000000").
    to_return(:status => 200, :body => "01", :headers => {})
end

我目前正在编写一个服务类的规范,该服务类发送一个SMS并在我们的数据库中创建它的日志。我尝试存根此请求,但@text.sms_uidSecureRandom.urlsafe_base64随机代码。我也在config.before(:each)中留言。

因此,我无法在sms_uid中指定stub_request,因为在调用存根之后会生成随机sms_uid。这导致测试每次都失败。有没有一种方法可以在生成代码之后将请求存根(换句话说,在它通过特定方法之后),或者是否存在一种方法来存根通过域的所有请求" https://api.silverstreet.com& #34;

1 个答案:

答案 0 :(得分:2)

我看到两个选项:

  • 存档SecureRandom.urlsafe_base64以返回已知字符串并在stub_request时使用该已知字符串:

    config.before(:each) do
      known_string = "known-string"
      allow(SecureRandom).to receive(:known_string) { known_string }
      stub_request(:post, "https://api.3rdpartysmsprovider.com/send.php?body=This%20is%20a%20test%20message&destination=60123456789&dlr='1'&output=json&password=0000000&reference=#{known_string}&sender=silver&username=0000000").
        to_return(status: 200, body: "01", headers: {})
    end
    

    如果您的应用程序中的其他位置使用了SecureRandom.urlsafe_base64,则只需要在生成此请求的规范中将其存根。

  • 是的,您可以将任何POST存根到该主机名

    stub_request(:post, "api.3rdpartysmsprovider.com").
      to_return(status: 200, body: "01", headers: {})
    

    甚至对该主机名的任何类型的请求

    stub_request(:any, "api.3rdpartysmsprovider.com").
      to_return(status: 200, body: "01", headers: {})
    

    webmock has a very large number of other ways to match requests