Ruby on Rails-随机失败的RSpec测试

时间:2018-12-04 09:36:02

标签: ruby-on-rails ruby rspec

对不起我的愚蠢问题。

我添加了外部api以获取响应,以便检查邮政编码的有效性。

app / validators / zipcode_validator.rb

class ZipcodeValidator < ActiveModel::Validator
  def validate(record)
    record.errors.add(:zipcode, :blank) if record.zipcode.blank?
    record.errors.add(:zipcode, :not_found) if WmsService.wms_delivery_dates(record.zipcode).nil?
  end 
end

它在实际中可以正常运行,但是随机失败,并且在我运行rspec时花费了更多时间。

对于这种情况有什么好的解决方案?

1 个答案:

答案 0 :(得分:4)

您不应在测试中调用外部API。有几种方法可以避免这种情况:

  1. VCR gem会在首次调用时记录API响应,然后从磁盘进行响应(快速而可靠)。
  2. 模拟HTTP调用,例如与WebMock。您需要编写指定的模拟请求并在您的规范中编写响应。它可以帮助您提高测试的可读性,也有助于测试边缘情况。
  3. 在类中包装您的服务呼叫,并将其替换为RSpec存根。
  4. 将服务调用包装在接受适配器的类中。适配器负责调用外部服务。在测试环境中,通过具有预定响应的测试适配器。