![](/img/trans.png)
[英]Trying to do an integration testing with RSpec and Capybara. When running “rspec spec” it just opens the browser and does nothing
[英]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.