如何测试调用外部API

时间:2017-01-31 11:37:25

标签: ruby-on-rails rspec shoulda

我无法理解下面的案例中要测试的内容以及如何进行测试。

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

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和工厂女孩。

2 个答案:

答案 0 :(得分:1)

使用webmockvcr宝石来存储外部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文件并记录新的样本响应。

答案 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})

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