簡體   English   中英

當代碼按預期工作時,Capybara / Rspec / FactoryGirl規范失敗

[英]Capybara / Rspec / FactoryGirl spec failing when the code does work as intended

在使用rspec規范時遇到麻煩。 實際的代碼似乎運行良好,但是我的規范仍然失敗。 我正在使用FactoryGirl,Rspec和Capybara。 這是spec / features / admin / admin_users_spec.rb的一部分:

require 'spec_helper'

describe "Admin::Users" do

  subject { page }

  context "When admin signed in" do
    let(:admin) { FactoryGirl.create(:admin) }
    let(:user) { FactoryGirl.create(:user) }

    before { sign_in admin }

    context "when visiting admin users" do

      before { visit admin_users_path }

      it_should_behave_like "admin visiting admin page"
      it { should have_content('- User Index') }
      it { should have_content(user.email) }  # This test is failing
    end
  end
end

失敗的測試有注釋。

這是我的用戶工廠。

require 'faker'

FactoryGirl.define do 
  factory :user do
    email         { Faker::Internet.email }
    admin         false
    super_admin   false
    password      "password"
    password_confirmation "password"
    confirmed_at  Time.now

    factory (:admin) do
      admin true
    end

    factory (:super_admin) do 
      admin true
      super_admin true
    end
  end
end

當您在管理控制台中找到用戶的索引時,管理員應該會看到用戶列表。 因此,除了當前的管理員外,我還創建了另一個用戶來填充測試數據庫。 這是一個示例失敗消息:

Failures:

  1) Admin::Users When admin signed in when visiting admin users should text "christian.stark@rempel.com"
     Failure/Error: it { should have_content(user.email) }
       expected to find text "christian.stark@rempel.com" in "Under The Gun Theater Admin Edit profile Logout Dashboard Users Posts Pages Shows Classes People Photos Admin Dashboard - User Index Email Roles Last Logged In geovanni.marks@kaulke.com admin May 18, 2014 11:59 Logged in as geovanni.marks@kaulke.com"
     # ./spec/features/admin/admin_users_spec.rb:53:in `block (4 levels) in <top (required)>' 

如您所見,頁面上生成的表僅包含管理員的電子郵件地址。 找不到其他用戶“ christian.stark@rempel.com”。 同樣,當我實際登錄該應用程序時,它可以工作,因此我不確定為什么該測試無法正常工作。

使用let! 而不是let user

let惰性計算的 ,也就是說, user只有在被調用之前才會存在。 let! 通過熱切評估區塊來幫助解決此問題。

let!(:user) { FactoryGirl.create(:user) }

閱讀更多關於let和let! 這里。

或者,您可以在before塊中手動create用戶,如下所示:

before do
  @user = FactoryGirl.create(:user)
  sign_in admin
end
#corresponding test:
it { should have_content(@user.email) }  # This test should pass

在加載頁面之前,不會創建您的用戶。 let在RSpec中是懶惰的。 用戶記錄在以下行創建:

it { should have_content(user.email) } 

這將始終失敗,因為在頁面加載之前未創建用戶。 您可以將let(:user)更改為let!(:user) ,它將在測試之前急於運行它。 但是,您可能需要考慮其他結構,這有助於避免這些問題:

admin = create(:user, :admin)
user = create(:user)

sign_in admin
visit admin_users_path

expect(page).to have_content('- User Index')
expect(page).to have_content(user.email)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM