2017-12-29 42 views
0

나는 기본적인 형태의 테스트 카피 바라를 사용하고 있습니다 - 사용자가 내용을 입력하고 제출 때 새로운 User 기록카피 바라 웹킷은 신속하게 양식을 제출하지 않는 것

it "creates a new user" do 
    visit some_random_path 

    # Fill In Form 
    fill_in("name", with: "foo bar") 
    fill_in("email", with: "[email protected]") 

    expect do 
    click_button("Submit") 
    end.to change { User.count }.by(1) 
end 

expect를 만들어야을 이 1 씩 User.count 증가가 표시되지 않기 때문에 내가

click_button("Submit") && sleep(0.1) 

같은 것을 할 경우는 잘 작동 것으로 나타났습니다 그러나 블록에서 오류가 발생합니다!

RSpec이 도 즉각인지 확인하려고합니다. 즉, Capybara가 실행되는 브라우저가 실제로 양식을 제출하고 결과를 DB에 위임하기 전에 확인해야합니다.

자바 스크립트를 사용하지 않고 있습니다. 일반 나이가 :webkit입니다.

왜 이런 일이 벌어지고 있는지에 대한 생각이 있으십니까?

아래는 내 카피 바라 환경 설정입니다. 나는 멀티 호스트 응용 프로그램을 가지고있다. (나는 무엇이든지간에 apartment gem을 사용하고있다.) 그래서 나는 아래에 언급 된 것처럼 응용 호스트로서 localhostlvh.me을 사용한다. 그러나 나는 위의 것을 방해 할 것이라고 상상할 수 없다.

Capybara.configure do |config| 
    config.ignore_hidden_elements = true 
    Capybara.default_driver = :webkit 
    config.javascript_driver = :webkit 
end 

Capybara::Webkit.configure do |config| 
    config.block_unknown_urls 
    config.allow_url("lvh.me") 
end 

RSpec.configure do |config| 
    config.before(:suite) do 
    Capybara.always_include_port = true 
    # The default is to treat each spec as single tennat, in which case 
    # we want to hit localhost. Hitting the Capbyara default of www.example.com 
    # causes the apartment setup to try and parse the `www` as a subdomain 
    Capybara.app_host = "http://localhost" 
    end 

    config.before(:each, multi_tenant: true) do 
    # For multi-tenant specs, use "lvh.me" 
    Capybara.app_host = "http://lvh.me" 
    end 
end 

고마워요!

답변

1

"실제 브라우저"드라이버 중 하나 인 Capybara (rack_test를 제외하고 거의 모두)를 사용하는 경우 버튼을 클릭하여 트리거되는 동작은 click 메서드가 반환 될 때 완료되지 않습니다. 즉, 이동하기 전에 작업이 완료되었음을 나타내는 페이지의 눈에 보이는 변경 사항을 확인해야합니다. 귀하의 경우에는 그 기능 테스트를 작성할 때 일의 직접 DB 검사를 수행하는 것은 일반적으로 나쁜 코드 냄새를 간주됩니다

expect do 
    click_button("Submit") 
    expect(page).to have_text("New User Created") # whatever appears on screen to indicate successful creation of the user 
end.to change { User.count }.by(1) 

주 같은 것을 의미 할 것입니다, 당신은 정말 그냥 새 사용자를 확인해야하는 것은 사용자의 인덱스를 보여줍니다 성공 메시지가 나타나는지 확인하거나 비슷한 메시지가 나타나면 User.count을 확인하십시오.

+0

수정 사항이 훌륭했습니다. 필자는'expect (current_path) .to eq (current_path)'를 일종의 해킹으로 사용하여'current_path'가 사용 가능할 때까지 기다리게했습니다. 또한 개인 메모에서 Capybara에 대한 꾸준한 지원에 감사드립니다. 이것은 매우 유용한 도구이며 유지 보수에 많은 시간과 노력이 필요하다는 것을 잘 알고 있습니다. – user2490003

+1

@ user2490003 흠 -'expect (current_path) .to eq (current_path)'가 실제로 무엇을하는지 확신 할 수 없다. 'expect (page) .to_current_path (expected_path)'가 훨씬 더 좋을 것이라고 기대하는 경로를 알고 있다면 ('current_path' /'current_url'과 함께'eq' matcher를 사용하는 것은 결코 좋은 생각이 아닙니다) –