如何测试调用外部的模型实例方法 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})
我无法理解在下面的案例中要测试什么以及如何测试。
我在 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})