2016-05-25 11 views
2

So habe ich diese Funktion spec in meiner Rails-AnwendungSchienen. Capybara fill_in findet Texteingaben aber nicht fill_in nicht

require 'rails_helper' 

feature 'As a signed in user' do 
    let(:user) {create(:user)} 
    let(:article) { create(:article)} 
    before {login_as(user, :scope => :user)} 

    scenario 'I can edit article with valid attributes' do 
    visit edit_article_path(article) 
    puts current_path 
    fill_in 'article_name', with: 'Valid name' 
    fill_in 'article_content', with: 'Valid content' 
    # save_and_open_page 
    click_button 'Update Article' 
    expect(article.name).to eq 'Valid name' 
    end 
end 

und fill_in nicht wirklich die Eingabefelder mit Valid name und Valid content füllen. Ich debugge es durch Speichern und Öffnen der Seite und die Werte bleiben gleich, also denke ich, es ist kein Problem mit meiner Rails App, sondern eher etwas mit Capybara. In anderen zukünftigen Spezifikationen:

require 'rails_helper' 

feature 'As a signed in user' do 
    let(:user) {create(:user)} 
    let(:article) { build(:article)} 
    before {login_as(user, :scope => :user)} 

    scenario 'I can create article with valid attributes' do 
    visit '/articles/new' 
    fill_in 'Name', with: article.name 
    fill_in 'article_content', with: article.content 
    expect {click_button 'Create Article'}.to change {Article.count}.by(1) 
    end 
end 

alles funktioniert wie erwartet. Der Fehler, den ich erhalte, ist:

Failures: 

    1) As a signed in user I can edit article with valid attributes 
    Failure/Error: expect(article.name).to eq 'Valid name' 

     expected: "Valid name" 
      got: "Name1" 

     (compared using ==) 
    # ./spec/features/articles/article_update_spec.rb:15:in `block (2 levels) in <top (required)>' 

Was kann der Grund dafür sein und wie man eine Spezifikationsdurchführung bildet?

Antwort

1

Es scheint, dass Sie den Rack-Test-Treiber verwenden, da Ihr Test nicht als js: true markiert ist. Angenommen, dies ist wahr, Ihr Problem ist, dass article bereits im Speicher ist, und nicht erneut von der DB neu geladen wird, bevor Sie nach der Namensänderung suchen. Aktualisieren der Test auf die folgenden wird ein Neuladen erzwingen und dann sollte Ihr Test

expect(article.reload.name).to eq 'Valid name' 

passieren Wenn Sie nicht das Rack-Test-Treiber dann click_button asynchron sein und Sie werden andere Probleme haben, da du bist nicht nach Änderungen im Browser suchen, bevor nach Änderungen am Datenbankobjekt gesucht wird.

+0

Großartig! Vielen Dank, das hat das Problem gelöst. –