Как заглушки запросов на домене или после метода?

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/"?

1 ответ

Решение

Я вижу два варианта:

  • огрызок 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 есть очень много других способов сопоставления запросов.

Другие вопросы по тегам