【问题标题】:RSpec mocked object and (state) variablesRSpec 模拟对象和(状态)变量
【发布时间】:2013-01-09 15:11:34
【问题描述】:

我在 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
##########

【问题讨论】:

    标签: ruby rspec mocking zeromq


    【解决方案1】:

    :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
    ##########
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多