我正在尝试测试一个帖子。假设客户,地点,消息都在上面的代码中,但发布时间很长。我试图测试“消息”变量,但由于它不是一个实例变量而且它在一个线程中,我无法很容易地测试它。我假设存根线程是使用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
提前谢谢!
答案 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示例可能在线程执行之前完成运行,从而导致测试失败。