如何使用Rspec存根线程?

时间:2013-06-28 21:58:24

标签: multithreading testing rspec controller stub

我正在尝试测试一个帖子。假设客户,地点,消息都在上面的代码中,但发布时间很长。我试图测试“消息”变量,但由于它不是一个实例变量而且它在一个线程中,我无法很容易地测试它。我假设存根线程是使用rspec测试它的正确途径,但如果你有任何其他建议如何准确测试“消息”变量将是非常有帮助的。这是我正在做的基本版本:

Class Messages
  def order_now
    conf = venue.confirmation_message
    message = "Hi #{customer.first_name}, "
    if conf && conf.present?
      message << conf
    else
      message << "your order has been received and will be ready shortly."
    end

    Thread.new do
      ActiveRecord::Base.connection_pool.with_connection do
        Conversation.start(customer, venue, message, {:from_system => true})
      end
      ActiveRecord::Base.connection_pool.clear_stale_cached_connections!
    end         
  end
end

提前谢谢!

1 个答案:

答案 0 :(得分:2)

你必须在这里变得有点聪明:

it "should test the conversation message" do
  Conversation.should_receive(:start).with(
    instance_of(Customer), 
    instance_of(Venue),
    "your order has been received and will be ready shortly.",
    {:from_system => true}
  ).and_call_original

  message_instance.order_now.join
end

基本上,您可以测试是否使用正确的参数调用Conversation::start。但是,这里有一个微妙之处 - 你调用message_instance.order_now.join,因为order_now返回线程,并且你想在rspec示例完成之前等待线程完成运行。 #join将阻止主线程的执行,直到引用的线程完成运行。否则,rspec示例可能在线程执行之前完成运行,从而导致测试失败。