복붙노트

[RUBY-ON-RAILS] 이 RSpec에 / 카피 바라 테스트를 통과하는 원인 왜 후크 후에 "잠 1"을 추가합니까?

RUBY-ON-RAILS

이 RSpec에 / 카피 바라 테스트를 통과하는 원인 왜 후크 후에 "잠 1"을 추가합니까?

나는 레일 4.0.5, RSpec에 2.14.1, 카피 바라 2.2.1, 카피 바라 - 웹킷 1.1.0 및 database_cleaner 1.2.0을 사용하고 있습니다. 나는 다음과 같은 기능 테스트와 몇 가지 이상한 행동을보고 (메뉴가 나타나도록 아이콘을 가리키면, 게시물에 댓글을 보는 사용자를 시뮬레이션하고 댓글을 삭제 메뉴 항목을 클릭)하고 있습니다 :

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

이 시험으로 인해 일부 레코드가 같은 데이터베이스에서 검색되는 항상 시간의 80 %에 대해 실패 nil-- I GET NoMethodError : 무기 호에 대한 정의되지 않은 방법 X는 : NilClass는 X의 다양한 값에 대해 때때로 전무는 존재가의 코멘트입니다 삭제는, 때로는 때로는 주석 / 게시물의 작성자, 댓글이에 붙어있는 게시물입니다.

나는 시험의 끝에 잠 1을 추가하면 전달합니다

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

나는 블록 후 수면 1을 넣어 경우에도 전달합니다.

어떤 생각이 왜 이런 NoMethodErrors를 얻을 수 및 / 또는 내가 작업이 완료가 결국 두 번째 잠을 만들면 왜 테스트에 통과?

해결법

  1. ==============================

    1.나는 그것이 데이터베이스에서 삭제되기 전에이 댓글이 (당신이 주장하고있는 마지막 인) 페이지에서 사라질 때까지 응용 프로그램에서 가능하다고 생각한다. 삭제가 발생하기 전에 테스트를 정리할 수있는 것을 의미한다. 이 경우 당신은 실제 삭제가 시험의 끝에서 발생하는 대기하여 문제를 해결할 수 있습니다. 나는이 방법은 약 (카피 바라 2에서 제거하지만 때로는 여전히 필요 된 방법의 재 구현)가

    나는 그것이 데이터베이스에서 삭제되기 전에이 댓글이 (당신이 주장하고있는 마지막 인) 페이지에서 사라질 때까지 응용 프로그램에서 가능하다고 생각한다. 삭제가 발생하기 전에 테스트를 정리할 수있는 것을 의미한다. 이 경우 당신은 실제 삭제가 시험의 끝에서 발생하는 대기하여 문제를 해결할 수 있습니다. 나는이 방법은 약 (카피 바라 2에서 제거하지만 때로는 여전히 필요 된 방법의 재 구현)가

    def wait_until(delay = 1)
      seconds_waited = 0
      while ! yield && seconds_waited < Capybara.default_wait_time
        sleep delay
        seconds_waited += 1
      end
      raise "Waited for #{Capybara.default_wait_time} seconds but condition did not become true" unless yield
    end
    

    나는 할 수 있도록

    wait_until { Comment.count == 0 }
    

    시험한다.

    또 다른 방법은 블록 요청이 시험이 끝난 후 만들어진 것으로 랙 미들웨어를 추가하는 것입니다. 이 접근법은 여기에 자세히 설명되어 있습니다 : http://www.salsify.com/blog/tearing-capybara-ajax-tests 나는 그것이 RSpec에 기능 사양의 좋은 크기의 스위트 룸에 데이터 유출을 해결하는 매우 좋은 일을 보았다.

  2. ==============================

    2.https://github.com/jnicklas/capybara#asynchronous-javascript-ajax-and-friends

    https://github.com/jnicklas/capybara#asynchronous-javascript-ajax-and-friends

  3. from https://stackoverflow.com/questions/23554882/why-does-adding-sleep-1-in-an-after-hook-cause-this-rspec-capybara-test-to-pas by cc-by-sa and MIT license