如何从 Ruby 中的 Mocha 模拟返回动态值
我的问题的要点如下:-
我正在用 Ruby 为下面表示为“post_to_embassy”的方法编写一个 Mocha 模拟。为了描述问题,实际方法的作用并不是我们真正关心的。但我需要模拟返回动态值。下面的过程“&prc”代替实际方法正确执行。但 Mocha 中的“with”方法只允许返回布尔值。所以下面的代码输出 nil。我需要它输出通过 orderInfoXml 传递的值。有谁知道我可以使用的替代方法?
require 'rubygems'
require 'mocha'
include Mocha::API
class EmbassyInterface
def post_to_embassy(xml)
puts "This is from the original class:-"
puts xml
return xml
end
end
orderInfoXml = "I am THE XML"
mock = EmbassyInterface.new
prc = Proc.new do |orderXml|
puts "This is from the mocked proc:-"
puts orderXml
orderXml
end
mock.stubs(:post_to_embassy).with(&prc)
mock_result = mock.post_to_embassy(orderInfoXml)
p mock_result
#p prc.call("asd")
输出:-
This is from the mocked proc:-
I am THE XML
nil
The gist of my problem is as follows:-
I'm writing a Mocha mock in Ruby for the method represented as "post_to_embassy" below. It is not really our concern, for the purpose of describing the problem, what the actual method does. But I need the mock to return a dynamic value. The proc '&prc' below is executing rightly in place of the actual method. But the "with" method in Mocha only allows for boolean values to be returned. So the code below outputs nil. I need it to output the value being passed through orderInfoXml. Does anyone know of an alternate method I can use?
require 'rubygems'
require 'mocha'
include Mocha::API
class EmbassyInterface
def post_to_embassy(xml)
puts "This is from the original class:-"
puts xml
return xml
end
end
orderInfoXml = "I am THE XML"
mock = EmbassyInterface.new
prc = Proc.new do |orderXml|
puts "This is from the mocked proc:-"
puts orderXml
orderXml
end
mock.stubs(:post_to_embassy).with(&prc)
mock_result = mock.post_to_embassy(orderInfoXml)
p mock_result
#p prc.call("asd")
output:-
This is from the mocked proc:-
I am THE XML
nil
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我不确定是否有一个完美的方法。但为了让生活更轻松,而不是存根每个可能的响应(如另一个答案中所述),您可以使用 Mocha 的
yields
方法。输出:
这将要求您分配 prc 的返回值,而且它并不完全漂亮(imo)。但是,您不必取消每个期望,这会给您很大的自由。
I'm not sure if there is a perfect method for this. But to make life easier, than to stubbing each possible response (as described in another answer), you could go with Mocha's
yields
method.outputs:
This will require you to assign the return of your prc, and it's not exactly pretty (imo). But, you don't have to stub out each expectation, which will give you quite a bit of freedom.
一般来说,您通常最好在测试中指定显式返回值。如果您引入单独的逻辑来确定返回什么值,它往往会使测试难以理解和维护。
我建议您使用 Expectation#with 和合适的 ParameterMatchers 显式定义不同参数值的返回值或使用 StateMachine 功能。
In general, you are normally better off specifying explicit return values in tests. It tends to make tests hard to understand and hard to maintain if you introduce separate logic into determining what value to return.
I would suggest that you either use Expectation#with with suitable ParameterMatchers to explicitly define return values for different parameter values or use the StateMachine functionality.
Mocha 似乎不支持这一点。将其添加到您的 test_helper.rb:
然后将测试的最后 4 行替换为:
Mocha doesn't appear to support this. Add this to your test_helper.rb:
Then replace the last 4 lines of your test with:
我还没有找到一种方法使模拟方法的输出完全动态,但如果您的输入数量有限且已知,则可以使输出正常工作。
输出:
I haven't found a way to make the output of a mocked method completely dynamic, but if you have a limited, known number of inputs you can get the output to work correctly.
output: