我无法理解下面的案例中要测试的内容以及如何进行测试。
我在地址模型上有以下实例方法
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和工厂女孩。
答案 0 :(得分:1)
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
文件并记录新的样本响应。
答案 1 :(得分:0)
您可以在perform
的任何实例上存根CalendarEventLocationParsingWorker
方法以返回所需的值
语法:
allow_any_instance_of(Class).to receive(:method).and_return(:return_value)
例如:
allow_any_instance_of(CalendarEventLocationParsingWorker).to receive(:perform).and_return({code: 0})