Hi Myron

Thanks for helping me. I would definitely explore your options. Coming to 
Sidekiq, I have withdrawn Sidekiq option as my project doesn't need any 
type background processing anywhere apart from sending an email. 




On Sunday, 7 June 2015 12:43:08 UTC+5:30, Myron Marston wrote:
>
>
>
> On Friday, June 5, 2015 at 4:01:42 AM UTC-7, siva wrote:
>>
>>
>> Hi 
>>
>> Here is my following code:
>>
>>
>> # app/models/purchase_order.rb
>> class PurchaseOrder
>>
>>   after_create :send_po_by_mail
>>
>>   def send_po_by_mail
>>
>>     Thread.new do
>>       begin
>>         Notifier.generate_po(self).deliver_now
>>         self.update_attributes(mail_status: SUCCESS)
>>       rescue
>>         self.update_attributes(mail_status: FAIL)
>>       end 
>>     end 
>>   end
>> end
>>
>> # spec/models/purchase_order_spec.rb
>>
>> example "update mail status as 'success' if sent successfully" do
>>   allow(Notifier).to receive(:generate_po).and_return(msg = 
>> double('ActionMailer::MessageDeliver'))
>>   allow(msg).to receive(:deliver_now).and_return(true)
>>   po = create(:purchase_order, job: create(:job))
>>   
>>   expect(po.reload.mail_status).to eq(PurchaseOrder::SUCCESS)
>> end 
>>
>>
>>
>>
>>
>> When I ran rspec the above test case is failing. Where I am doing wrong? 
>> Could you help me?
>>
>
> Threads provide no guarantees about when the OS will schedule them.  When 
> you start using threads you need to synchronize at appropriate points if 
> you want to assert that the thread completed it's work.  For this kind of 
> situation, the standard way to do that is `Thread#join`:
>
> http://ruby-doc.org/core-2.2.0/Thread.html#method-i-join
>
> It will block until the thread is complete, so that have a guarantee that 
> the thread's work was finished.
>
> Unfortunately, the thread instance is created in a private method and 
> discarded so you don't have direct access to that thread from your spec in 
> order to join on it.  You could use `Thread.list` to find that thread:
>
> http://ruby-doc.org/core-2.2.0/Thread.html#method-c-list
>
> ...but I'd say that your code isn't very testable, and it's far better to 
> use your testing pain as an impetus to improve the design.
>
> Most people do that kind of background work using something like Sidekiq 
> rather than a thread:
>
> http://sidekiq.org/
>
> Have you considered using that?
>
> Myron
>

-- 
You received this message because you are subscribed to the Google Groups 
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rspec/38134309-59d3-4ab2-9b7b-8547f3572fcc%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to