rails minitest 存根断言替代方法

Posted

技术标签:

【中文标题】rails minitest 存根断言替代方法【英文标题】:rails minitest stubbing to assert alternate method 【发布时间】:2022-01-21 23:14:37 【问题描述】:

一种方法依赖于两个不同的地理定位 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

找到一个返回空 lon/lat 集的数据集是具有挑战性的(正统推动一个人先编写测试), 所以..有没有办法存根测试,以便

do_geocode_lookup 返回空的经纬度值 do_alternate_geocode_lookup(resource) 方法被调用?并因此进行了测试?
sign_in operator_user
post admin_create_users_url, params: user:  [...]  
assert[...]

【问题讨论】:

【参考方案1】:

使用Mocha,您可以存根一个方法,以便对象的任何实例都返回一个指定的值。

例如....

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

它还允许您测试一个方法是否被调用...

Account.any_instance.expects(:review_started)

您正在更改传入的资源而不是返回某些东西这一事实使事情变得有点棘手,但我很想让do_geocode_lookup 在找到某些东西时返回 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)
  

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

【讨论】:

以上是关于rails minitest 存根断言替代方法的主要内容,如果未能解决你的问题,请参考以下文章

ruby MiniTest:断言自定义异常(ERROR)

使用 Ruby MiniTest 之前/之后的套件

ruby 来自https://mattbrictson.com/minitest-and-rails

使用Rspec存根和模拟在Rails Oauth中实现100%的测试覆盖率

PHPUnit 方法调用期望与断言

C#:在所有派生类中具有*必需*实现的静态基类方法存根[重复]