San*_*o L 11 ruby-on-rails mocha.js testunit
我想在给定特定参数值时使用Mocha存根方法,并在给出任何其他值时调用原始方法.
当我这样做时:
MyClass.any_instance.stubs(:show?).with(:wanne_show).returns(true)
Run Code Online (Sandbox Code Playgroud)
我得到了
unexpected invocation for MyClass.show?(:other_value)
Run Code Online (Sandbox Code Playgroud)
我也知道,在没有'with'调用的情况下编写模拟时我可以存根所有参数,然后给出我特定的模拟.但是我必须知道每次通话的返回值,但事实并非如此:/
tldr; 有没有办法在存根中调用原始方法或只存储特定参数并留下其他参数?
今天我花了一个小时尝试让 Mocha 允许我只存根特定的会话变量,但失败了,而Rspec 可以轻松地实现这一点。虽然我无法找到一种方法来完成这项工作,但我确实找到了一种可能对某些人有所帮助的解决方法,具体取决于具体情况。
我的“解决方案”是在获取目标实例变量后删除会话存根:
ActionDispatch::Request::Session.any_instance.stubs(:delete).returns(state).then.returns(nonce).then.with do |sym|
ActionDispatch::Request::Session.any_instance.unstub(:delete) if sym == :login_nonce
true
end
Run Code Online (Sandbox Code Playgroud)
我在这里使用的技巧是,通过了解session.delete针对特定操作进行的前两次调用中将传递给的参数,我可以在进行第二次delete调用 (for login_nonce) 后删除存根,以便会话开始表现又像平常一样了。
构建with这样的块的另一个潜在有用的方面是该块具有调用者的完整上下文,因此可以直接检查或提取块内的会话内容。也就是说,如果您想要一个测试来获取blah会话密钥的值,您应该能够编写类似的内容
ActionDispatch::Request::Session.any_instance.stubs(:[]).with do |key|
@blah = session[key] if key == :blah
true
end
Run Code Online (Sandbox Code Playgroud)
据我所知,该with块总是必须返回 true,否则 Mocha 会抛出异常Minitest::Assertion: unexpected invocation,因为它不知道如果它已经存根了一个方法但传入的参数与它可以的参数不匹配,该怎么办处理。根本问题似乎是,一旦调用stubs,any_instance您就不能再让 Mocha 从实际实例返回值(与 Rspec 不同,它允许使用上面链接的答案中的方式session回退到原始对象)。and_call_original
希望将来有人可以在其中一些想法的基础上构建出更优雅的答案,但由于近 8 年过去了,还没有答案,我认为这可能是一个可用的起点。
| 归档时间: |
|
| 查看次数: |
3126 次 |
| 最近记录: |