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 来自https://mattbrictson.com/minitest-and-rails