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.