2013-06-28 5 views
1

Я пытаюсь протестировать нить. Предположим, что клиент, место встречи, сообщение находятся в вышеуказанном коде, но было бы очень долго публиковать сообщения. Я пытаюсь проверить переменную «сообщение», но поскольку она не является переменной экземпляра, и она находится в потоке, я не могу ее легко протестировать. Я предполагаю, что обрезание потока будет правильным путем для проверки этого с помощью rspec, но если у вас есть другие предложения о том, как точно проверить переменную «сообщение», которая будет очень полезна. Вот основной вариант того, что я делаю:Как заглушить поток с помощью 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 

Спасибо заранее!

ответ

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 может завершиться до того, как поток выполнится, что приведет к ошибке тестирования.

+0

Я добавил более подробную информацию к методу, который, как мы надеемся, проливает больше света на тест. Я просто пытаюсь проверить, что если host.confirmation пусто, что «ваш заказ получен и будет готов в ближайшее время». Строка будет перекопана в строку сообщения. Я хотел бы протестировать переменную сообщения, но rspec позволяет тестировать только созданные переменные, такие как @message, поэтому единственный способ проверить ответ - в потоке. Дайте мне знать, что вы думаете, и как вы проверите переменную сообщения с помощью Rspec. Благодаря! – johnfigueiredo

+0

Обновлен мой ответ. –

+0

Это сработало. Спасибо! – johnfigueiredo