如何解决如何在 Minitest 中模拟一系列方法
似乎 10 多年前正确存根方法链的唯一信息来源:
https://www.viget.com/articles/stubbing-method-chains-with-mocha/
我感到非常沮丧,因为我找不到有关如何正确执行此操作的信息。我想基本上模拟 Rails.logger.error
。
更新:我基本上想做一些简单的事情
def my_action
Rails.logger.error "My Error"
render json: { success: true }
end
并且想写一个这样的测试:
it 'should call Rails.logger.error' do
post my_action_url
???
end
解决方法
在这种情况下,我想您可能误解了术语 chain of methods
,它们意味着 ActiveRecord::Relation
的链可以附加另一个。在你的情况下 Rails.logger
是一个 ActiveSupport::Logger
就是这样。您可以模拟记录器并像这样测试您的案例:
mock = Minitest::Mock.new
mock.expect :error,nil,["My Error"] # expect method error be called
Rails.stub :logger,mock do
post my_action_url
end
mock.verify
除此之外,我个人不喜欢他们通过存根chain of method
进行测试的方式,它太详细了,例如:我有一个查询前十名用户的测试用例,我为方法链编写了一个存根例如User.where().order()...
,一开始没问题,然后假设我需要重构查询或创建数据库视图顶级用户以优化性能,如您所见,我需要再次存根方法链。为什么我们只是将测试用例视为黑盒,在我的情况下,测试用例不应该知道(也不关心)我如何实现查询,它只检查结果应该是前十名用户。>
更新
由于每个请求 Rails 内部调用 Logger.info
那么如果你想忽略它,你可以 stub
该函数:
def mock.info; end
如果您想测试调用方法的数量或验证错误消息,您可以使用 spy
(我想您已经知道这些单元测试概念)
mock = Minitest::Mock.new
def mock.info; end
spy = Hash.new { |hash,key| hash[key] = [] }
mock.expect(:error,nil) do |error|
spy[:error] << error
end
Rails.stub :logger,mock do
post my_action_url
end
assert spy[:error].size == 1 # call time
assert spy[:error] == ["My Error"] # error messages
最好创建一个 test helper
方法来重用上述代码。如果需要,您可以改进该辅助方法的行为,类似于 Jest 中的 mockImplementation
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。