2011-08-16 9 views
5

Chciałbym sprawdzić, czy wywołania zwrotne "opóźnienia_zwrotu" są wywoływane, ale nie widzę sposobu, aby to zrobić, szczególnie gdy dotyczy to kilku warstw klas.jak przetestować haki oddzwaniania delayed_job przy użyciu RSpeca

Zakładając Mam modelu ActiveRecord takiego:

class MyJob < ActiveRecord::Base 
    def perform 
    # do some stuff 
    end 
    def after(job) 
    # called by delayed_job after perform completes 
    end 
end 

Konceptualnie, chcę test RSpec wzdłuż tych linii (choć wiem, że to nie jest poprawna):

it 'should call the :after callback hook' do 
    my_job = MyJob.create 
    my_job.should_receive(:after).with(an_instance_of(Delayed::Backend::ActiveRecord::Job)) 

    Delayed::Job.enqueue(my_job) 
    Delayed::Worker.new.work_off 
end 

Poświęciłem się stackoverflow, relishapp.com/rspec i wszystkim innym miejscom, o których mogę pomyśleć. To nie może być zbyt trudne, prawda? (Założę się, że @zetetic zna odpowiedź we śnie ...;)

(Uwaga: Mój przypadek używa klasy "shim" między MyJob i DJ. Odpowiedź na ten prosty przypadek może wywołać bardziej złożoną obserwację -on!)

+0

Jeśli chcesz tylko zweryfikować "po", nie można t zrzucisz wymaganie '.with (an_instance_of ...' Jako notatkę dodatkową, używam Delayed :: Worker.new (: quiet => true) .work_off, aby wyciszyć pracownika i każde marudzenie może Przyznaję jednak, że może istnieć wyjątek, którego nie widzę z tego powodu: – Nick

Odpowiedz

1

IMHO nie sądzę, jest to najlepsza rzecz do zrobienia ...

W ten sposób starasz spec zachowanie DelayedJob, a nie swoją aplikację i DJ już ma swój własny garnitur testów.

W każdym razie, co z kpiną z DelayedJob? Możliwe, że możesz określić, że Twój MockedJob wywoła twój hak po przetworzeniu i możesz odpowiednio utworzyć swoje dopasowywanie/oczekiwania ...

+0

Pozostawanie z dala od tego pytania przez ponad dwa lata (!) Myślę, że masz rację: pytanie, jak napisano, tylko próbuje aby zweryfikować zachowanie DJ'a i nie robi nic, aby zweryfikować mój kod. –

1

Moja sugestia polegałaby na sprawdzeniu, czy tabela Zadania tworzy nowy rekord pracy, a następnie introspekcja szczegółów tego rekordu. Używałem czegoś takiego w przeszłości.

it "should sync content from the remote CMS" do  
    DelayedJobs::CMS::Sync.module_eval do 
    def perform 
    url.should == "http://example.com/tools/datafeed/resorts/all" 
    Report.sync!([{'id' => 1, 'name' => 'resort foo'}]) 
    end 
end 

lambda do 
    Report.sync_all! 
end.should change(Delayed::Job, :count) 

lambda do 
    Delayed::Job.work_off 
end.should change(Resort, :count).by(2) 
end 
Powiązane problemy