rails minitest 存根断言替代方法

rails minitest stubbing to assert alternate method

一种方法依赖两个不同的地理定位 API,第二个用作备份:

def admin_create
  @user_object =  User.create!(user_params)
  set_area(@user_object)
end

def set_area(resource)
  do_geocode_lookup(resource)
  if !resource.lon
    do_alternate_geocode_lookup(resource)
  end
end

找到一个 returns 一个空的 lon/lat 集的数据集具有挑战性(正统派人先写测试), 所以..有没有办法对测试进行存根以便

sign_in operator_user
post admin_create_users_url, params: {user: { [...] } }
assert[...]

使用 Mocha 你可以存根一个方法,这样一个对象的任何实例 return 都是一个指定的值。

例如....

Account.any_instance.stubs(:reviews_enabled).returns(:true)

它还允许您测试调用了一个方法...

Account.any_instance.expects(:review_started)

事实上你正在改变传入的资源而不是 return 使事情变得有点棘手,但我很想 do_geocode_lookup return true 如果它找到一些东西,否则为 false,以使事情更容易测试。

def set_area(resource)
  found = do_geocode_lookup(resource)
  unless found
    found = do_alternate_geocode_lookup(resource)
  end
  found
end

然后你可以在你的测试中做这样的事情...

  Geocoder.any_instance.stubs(:do_geocode_lookup).returns(:false)
  Geocoder.any_instance.expects(:do_alternate_geocode_lookup)
  result = sut.set_area(user)
  

如果未调用预期的方法,您会收到“未调用预期的方法”错误。您可以使用存根和期望变得更加复杂,但在这种情况下您不必这样做。