2011-09-28 3 views
13

mam test tak:dochodzić oczekiwania wielokrotnej zmiany w obrębie jednej lambda prośba

lambda { post("/api/users", parameters) }.should change(User,:count).by(1) 
lambda { post("/api/users", parameters) }.should_not change(ActionMailer::Base, :deliveries) 

Ale chcę to zrobić tak:

lambda { post("/api/users", parameters) }.should change(User,:count).by(1).and_not change(ActionMailer::Base, :deliveries) 

Czy można to zrobić bez potrzebujesz dwóch postów?

Dzięki

+0

szukałem tego sam – prusswan

Odpowiedz

11

Znalazłem rozwiązanie, aby go przetestować.

lambda{ 
    lambda { post("/api/users", params) }.should change(User,:count).by(1) 
}.should change(ActionMailer::Base.deliveries, :count).by(1) 
2

W moich testach jestem bardzo surowe: Chcę każdy test testować tylko jedną rzecz. Zawsze wybieram pierwszą formę, a nie drugą.

Po drugie, nie jestem pewien, czy jest to technicznie możliwe. .should oczekuje bloku, który jest wykonywany przed i po lambda. W każdym razie, do mojej wiedzy aktualnie rspec nie popiera tego (i imho z dobrego powodu).

+0

OK, dziękuję za odpowiedź! –

0

Niedawno natknąłem tej kwestii podczas migracji niektóre request testy nad do feature formacie testowym dla Kapibara 2.1, a przełączanie składnię testowania tam od should opartych na expect opartym. Aby korzystać z oryginalnego pytanie jako przykład, miałem kod jak:

subject { -> { post("/api/users", parameters) } } 
it { should change(User,:count).by(1) } 
it { should_not change(ActionMailer::Base, :deliveries) } 

dostosowanie niniejszej nad do expect składni w teście scenario przedstawił kilka problemów i dała tego rodzaju (pracy) clunkiness (Przepraszam, nie duży wentylator jawnie zagnieżdżone lambda S/expect -ów):

expect(-> { expect(post("/api/users", parameters)).to change(User,:count).by(1) } 
).to_not change(ActionMailer::Base, :deliveries) 

Istnieje wiele rozwiązań tego problemu w this StackOverflow thread który próbowałem i udało się, ale to, co skończyło się robi po prostu śledzić oryginalny format nieco i podzielić się każde oświadczenie w swoim własnym scenario; coś takiego:

feature "Add users via API" do 
    given(:posting_parameters_to_api) { -> { post("/api/users", parameters) } } 

    scenario "foo" do 
    expect(posting_parameters_to_api).to change(User,:count).by(1) 
    end 

    scenario "bar" do 
    expect(posting_parameters_to_api).to_not change(ActionMailer::Base, 
                :deliveries) 
    end 
end 

więcej komunikatów niż oryginalny request ciemno, ale zasadniczo pracuje w taki sam sposób. Realizacja prawdopodobnie sprowadzi się do osobistego gustu.