Как возвратить динамическое значение от насмешки Мокко в Ruby

Суть моей проблемы следующим образом:-

Я пишу насмешку Мокко в 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
14
задан YOU 30 April 2010 в 05:59
поделиться

2 ответа

Я не нашел способа сделать вывод насмешливого метода полностью динамическим, но если у вас есть ограниченное, известное количество входов, вы можете заставить вывод работать правильно.

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."
0
ответ дан 1 December 2019 в 15:12
поделиться

Я не уверен, что для этого существует идеальный метод. Но чтобы облегчить жизнь, вместо того, чтобы выводить каждый возможный ответ (как описано в другом ответе), вы можете использовать метод 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, и это не совсем красиво (имо). Но вам не придется выводить каждое ожидание, что даст вам довольно много свободы.

5
ответ дан 1 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: