如何测试调用外部的模型实例方法 API

How to test a model instance method which makes a call to an external API

我无法理解在下面的案例中要测试什么以及如何测试。

我在 Address 模型上有以下实例方法

validate :address, on: [:create, :update]

def address
    check = CalendarEventLocationParsingWorker.new.perform("", self.structured, true )
    if check[:code] != 0
      errors.add(:base,"#{self.kind.capitalize} Address couldn't be analysed, please fill up as much fields as possible.")
    else
      self.lat = check[:coords]["lat"]
      self.lon = check[:coords]["lng"]
    end
  end

基本上它是一种调用创建和更新挂钩的方法,并与第三方API 检查地址是否有效。我如何在不实际调用第三方 api 而是模拟响应的情况下单独测试它?

我阅读了有关模拟和存根的信息,但我还不太了解它们。欢迎任何见解。使用 Rspec,shoulda matchers 和 factory girl。

使用 webmock or vcr gem 存根外部 api 响应

webmock 示例:

stub_request(:get, "your external api url")
  .to_return(code: 0, coords: { lat: 1, lng: 2 })

# test your address method here

使用 vcr 你可以 运行 你的测试一次,它会对外部 api 进行实际调用,将其响应记录到 .yml 文件然后重新使用它在以后的所有测试中。如果外部 api 响应发生变化,您只需删除 .yml 文件并记录新的示例响应。

您可以将 CalendarEventLocationParsingWorker 的任何实例上的 perform 方法存根到 return 所需的值

语法:

allow_any_instance_of(Class).to receive(:method).and_return(:return_value)

例如:

allow_any_instance_of(CalendarEventLocationParsingWorker).to receive(:perform).and_return({code: 0})

参考:Allow a message on any instance of a class