Używam szyn 4.0.5, rspec 2.14.1, capybara 2.2.1, capybara-webkit 1.1.0 i database_cleaner 1.2.0. Widzę dziwne zachowanie w następującym teście funkcji (który symuluje użytkownika wyświetlającego komentarz do postu, umieszczonego nad ikoną w celu wyświetlenia menu i kliknięcia pozycji menu w celu usunięcia komentarza):Dlaczego dodanie "uśpienia 1" w haku po wykonaniu powoduje przejście testu Rspec/Capybara?
let(:user){create(:user)}
let(:post){create(:post, author: user)}
let!(:comment){create(:comment, post: post, author: user)}
...
it "can delete a comment" do
assert(page.has_css? "#comment-#{comment.id}")
find("#comment-#{comment.id}-controls").trigger(:mouseover)
find("#comment-#{comment.id} .comment-delete a").click
assert(page.has_no_css? "#comment-#{comment.id}")
end
Ten test kończy się niepowodzeniem około 80% czasu, zawsze z powodu jakiegoś rekordu pobieranego z bazy danych jako nil
- Otrzymuję NoMethodError: undefined method X for nil:NilClass
, dla różnych wartości X. Czasami zero jest komentarzem, który jest usuwany, czasami jest to post do którego dołączony jest komentarz, czasami jest to autor komentarza/postu.
Jeśli dodać sleep 1
do końca testu, przechodzi:
it "can delete its own comment" do
assert(page.has_css? "#comment-#{comment.id}")
find("#comment-#{comment.id}-controls").trigger(:mouseover)
find("#comment-#{comment.id} .comment-delete a").click
assert(page.has_no_css? "#comment-#{comment.id}")
sleep 1
end
przechodzi również jeśli kładę sleep 1
w bloku after
.
Każdy pomysł, dlaczego dostaję te NoMethodErrors i/lub dlaczego test przechodzi, gdy śpię na sekundę po wykonaniu wszystkich prac?
W jakim wierszu kodu pojawia się 'NoMethodError'? To dziwne, że ustawienie "uśpienia" na * końcu * rozwiązuje to, ale warunki występujące w Capybara są częstym problemem. –
@BuckDoyle Wszystkie błędy mówią: 'Failure/Error: Nie można znaleźć pasującej linii z backtrace', a następnie odwołania do różnych metod modelu/kontrolera, które są wywoływane przez żądanie AJAX, które jest wyzwalane po usunięciu komentarza. Wygląda na to, że jest to stan wyścigowy, nie między asercją Capybara i usunięciem komentarza, ale między oderwaniem bazy danych a kodem zwrotnym, który działa po usunięciu. –