RSpec模拟对象和(状态)变量

时间:2013-01-09 15:11:34

标签: ruby rspec mocking zeromq

我在Ruby应用程序中使用ZMQ :: Poller,并希望编写一些rspec测试。由于轮询器提供register - 方法来注册套接字,以后可以使用readables访问,我需要以某种方式在我的模拟对象中保存已注册的套接字。

我认为这样的模式如下:

  @int_var = 'a'
  tst_mock = mock('Test')
  tst_mock.stub(:save_method) do |arg|
    @int_var = arg
  end
  tst_mock.stub(:return_method).and_return(@int_var)

  puts "##########"
  puts tst_mock.return_method
  tst_mock.save_method('b')
  puts tst_mock.return_method
  puts "##########"

是否有机会将'b'存储在@int_arg中?并在以后访问它以获得所需的输出:

##########
a
b
##########

1 个答案:

答案 0 :(得分:2)

:return_method的存根每次都会返回a,因为这是注册存根时传递给它的值。

您希望它是动态的,因此将块传递给返回正确值的存根。

@int_var = 'a'
tst_mock = mock('Test')
tst_mock.stub(:save_method) do |arg|
  @int_var = arg
end

# Passing a block, defer calculating of response until needed
tst_mock.stub(:return_method) do
  @int_var
end

puts "##########"
puts tst_mock.return_method
tst_mock.save_method('b')
puts tst_mock.return_method
puts "##########"

将输出:

##########
a
b
##########