ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象

标签 ruby-on-rails ruby unit-testing mocking rspec

假设我在 Store 的模型中有这个非常简单的方法:

  def geocode_address
      loc = Store.geocode(address)
    self.lat = loc.lat
    self.lng = loc.lng
  end

如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。

谢谢!
特里斯坦

最佳答案

使用内置模拟和 stub 的 rspecs,你可以做这样的事情:

setup do
  @subject = MyClass.new
end

it 'handles geocoder success' do
  mock_geo = mock('result', :lat => 1, :lng => 1)

  Store.stub!(:geocode).and_return mock_geo

  @subject.geocode_address

  @subject.lat.should == mock_geo.lat
  @subject.lng.should == mock_geo.lng
end


it 'handles geocoder errors' do
  Store.stub!(:geocode).and_raise Exception

  @subject.geocode_address

  @subject.lat.should == _something_reasonable_
  @subject.lng.should == _something_reasonable_
end

关于ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4869078/

相关文章:

ruby-on-rails - 从 ActiveRecord::Relation 获取 has_many

Ruby 按范围分组,数字数组?

ruby-on-rails - 使用AJAX显示错误消息Ruby on Rails

java - 莫基托。未捕获任何参数值

C 测试 - Unity 和 CMake 的 undefined reference

java - Spring & Mockito : Actual Object getting called in Unit Test

ruby-on-rails - Rails object.to_yaml 没有前导破折号

ruby-on-rails - 与两个外键的 has_many 关系

ruby - 有没有办法让 attr_reader 创建与实例变量名称不同的方法?

ruby-on-rails - Rspec - 预期 ActiveRecord::RecordInvalid 但没有引发任何问题?