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