Суть моей проблемы следующим образом:-
Я пишу насмешку Мокко в Ruby для метода, представленного как "post_to_embassy" ниже. Это не действительно наше беспокойство, в целях описания проблемы, что делает фактический метод. Но мне нужна насмешка для возвращения динамического значения. proc '&prc' ниже выполняется справедливо вместо фактического метода. Но "с" методом в Мокко только позволяет, чтобы булевы значения были возвращены. Так код ниже выходного ноля. Мне нужен он для вывода значения, прошедшего 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
Я не нашел способа сделать вывод насмешливого метода полностью динамическим, но если у вас есть ограниченное, известное количество входов, вы можете заставить вывод работать правильно.
require 'rubygems'
require 'mocha'
include Mocha::API
class EmbassyInterface
def post_to_embassy(xml)
"original: #{xml}"
end
end
to_mock = EmbassyInterface.new
orderInfoXml1 = "I am the first XML."
orderInfoXml2 = "I am the second XML."
p to_mock.post_to_embassy(orderInfoXml1)
prc = Proc.new do |xml|
"mocked: #{xml}"
end
to_mock.stubs(:post_to_embassy).with(orderInfoXml1).returns(prc.call(orderInfoXml1))
to_mock.stubs(:post_to_embassy).with(orderInfoXml2).returns(prc.call(orderInfoXml2))
p to_mock.post_to_embassy(orderInfoXml1)
p to_mock.post_to_embassy(orderInfoXml2)
p to_mock.post_to_embassy(orderInfoXml1)
output:
"original: I am the first XML."
"mocked: I am the first XML."
"mocked: I am the second XML."
"mocked: I am the first XML."
Я не уверен, что для этого существует идеальный метод. Но чтобы облегчить жизнь, вместо того, чтобы выводить каждый возможный ответ (как описано в другом ответе), вы можете использовать метод Mocha yields
.
require "rubygems"
require "mocha"
include Mocha::API
class EmbassyInterface
def post_to_embassy(xml)
puts "This is form the original class:-"
puts xml
xml
end
end
order_info_xml = "I am the xml"
mock = EmbassyInterface.new
prc = Proc.new do |order_xml|
puts "This is from the mocked proc:-"
puts order_xml
order_xml
end
mock.stubs(:post_to_embassy).yields prc
prc_return = nil
mock.post_to_embassy { |value| prc_return = value.call("hello world") }
puts prc_return
mock.post_to_embassy { |value| prc_return = value.call("foo") }
puts prc_return
outputs:
This is from the mocked proc:-
hello world
hello world
This is from the mocked proc:-
foo
foo
Это потребует от вас назначить возврат вашего prc, и это не совсем красиво (имо). Но вам не придется выводить каждое ожидание, что даст вам довольно много свободы.