gpt4 book ai didi

ruby-on-rails - Mocha : stubbing method with specific parameter but not for other parameters

转载 作者:行者123 更新时间:2023-12-03 21:40:16 24 4
gpt4 key购买 nike

我只想在给定特定参数值时使用 Mocha stub 方法,并在给定任何其他值时调用原始方法。

当我这样做时:

MyClass.any_instance.stubs(:show?).with(:wanne_show).returns(true)

我得到一个
unexpected invocation for MyClass.show?(:other_value)

我也知道,在没有'with'调用的情况下编写模拟时我可以 stub 所有参数,然后给出我的特定模拟。但是我必须知道每次调用的返回值,但事实并非如此:/

tldr; 有没有办法在 stub 中调用原始方法或只 stub 特定参数而保留其他参数?

最佳答案

我今天花了一个小时试图让 Mocha 只允许我 stub 一个特定的 session 变量,就像 Rspec allows with ease .虽然我无法找到一种方法来完成这项工作,但我确实找到了一种可能对某些人有所帮助的解决方法,具体取决于具体情况。
我的“解决方案”是在获取目标实例变量后删除 session stub :

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
我在这里使用的技巧是,通过知道将传递给 session.delete 的参数。在针对特定操作的前两个调用中,我可以在第二个 delete 之后删除 stub 调用(用于 login_nonce ),因此 session 再次开始正常运行。
构建 with 的另一个潜在有用的方面像这样的 block 是 block 具有调用者的完整上下文,因此可以直接检查或提取 block 内的 session 内容。也就是说,如果你想要一个测试来获取 blah 的值。 session key ,您应该能够编写类似
ActionDispatch::Request::Session.any_instance.stubs(:[]).with do |key|
@blah = session[key] if key == :blah
true
end
据我所知, with block 必须返回 true,否则 Mocha 会抛出 Minitest::Assertion: unexpected invocation异常,因为它不知道如果它已 stub 方法但传入的参数与它可以处理的参数不匹配时该怎么办。根本问题似乎是,一旦有人调用 stubsany_instance ,您不能再让 Mocha 从实际的 session 返回值实例(与 Rspec 不同,它允许使用 and_call_original 回退到原始对象,如上面链接的答案中所示)。
希望将来有人可以在其中一些想法的基础上构建一个更优雅的答案,但是由于将近 8 年过去了,还没有答案,我认为这可能是一个可用的起点。

关于ruby-on-rails - Mocha : stubbing method with specific parameter but not for other parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16559374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com