2016-09-06 52 views
0

我是新手,需要測試。 我使用rspec-rails,factory_girl_railscapybara來測試Rails 5應用程序。 對於身份驗證我有設計Rspec功能測試。頁面內容在普通用戶和管理員中沒有區別

我的用戶模型有其他字段管理員。默認管理員是false。但第一個註冊用戶成爲管理員(user.admin = true)。

現在,當我在我的測試做user = create(:user)它創建了一個「普通」用戶(user.admin = false

但如果我puts page.body我可以看到哪些不應該渲染對於一個普通用戶的內容。

這裏是我的模板:

%menu 
%ul 
    - if user_signed_in? 
    %li 
     Hey, #{current_user.name} 
    %li= link_to "Edit Profile", edit_user_registration_path 
    - if current_user.admin 
     %li= link_to "Today's Orders", todays_orders_path 
     %li= link_to "Registered Users", users_path 
     %li= link_to "Add Dish", new_dish_path 
    %li= link_to "Sign Out", destroy_user_session_path 

功能測試的片段:

require 'rails_helper' 
require_relative '../support/authentication' 

feature 'page content' do 

    let(:user) { create(:user) } 

    scenario 'show page content' do 
    authentication = Authentication.new user 
    authentication.sign_in 

    puts page.body 
    end 
end 

這就是所說的回報:

<menu> 
<ul> 
<li> 
Hey, Test User 
</li> 
<li><a href="https://stackoverflow.com/users/edit">Edit Profile</a></li> 
<li><a href="/todays_orders">Today&#39;s Orders</a></li> 
<li><a href="/users">Registered Users</a></li> 
<li><a href="/dishes/new">Add Dish</a></li> 
<li><a href="https://stackoverflow.com/users/sign_out">Sign Out</a></li> 
</ul> 
</menu> 

我想current_user.admin被忽略什麼的。但如何使它正常工作?

UPD

這很有趣。首先,如果我創建一個用戶,比puts user.inspect它表明:

#<User id: 1, email: "[email protected]", name: "User_1", admin: false, created_at: "2016-09-06 15:15:31", updated_at: "2016-09-06 15:15:31">

,但如果我用(byebug)輸出顯示user.admin設置爲true:

(byebug) u = User.all <ActiveRecord::Relation [#<User id: 1, email: "[email protected]", name: "User_1", admin: true, created_at: "2016-09-06 15:15:31", updated_at: "2016-09-06 15:15:31">]>

下一頁事情是,如果我創建兩個用戶:

let(:admin) { create(:user) } let(:user) { create(:user) }

,並且比user登錄我仍然有可用的所有鏈接.. 但如果我創建的用戶是這樣的:

admin = User.create(name: 'admin', email: '[email protected]', password: 123456, password_confirmation: 123456) user = User.create(name: 'user', email: '[email protected]', password: 123456, password_confirmation: 123456)

和符號是user,一切工作正常。

+0

好吧,我們現在有更多信息。你的模型是什麼樣的?我假設所有的管理邏輯都在那裏,但你提到設計。分配管理員的邏輯很重要。對於您的第一個管理員爲false的情況,您是否確認了提交併重新加載? – Vangel

+0

你可以試試 'let!(:admin)...' – Vangel

+0

讓!(:admin)解決我的問題! 我的模型具有所有默認的Devises字段和兩個自定義:名稱和管理員。 以我用戶模型我已經定義了一個方法: 'DEF set_admin User.first.update_attribute(:管理員,真)如果User.count == 1 end' 其通過'after_create執行 :set_admin' 'let!'做什麼?讓@Vangel –

回答

2

測試運行在空的測試數據庫上。創建的第一個用戶是管理員,因爲你說過,所以這就是最新發生的事情。這方面的測試是正確的。您必須在測試中創建第二個用戶才能擁有普通用戶。

您可以在'it'塊內使用byebug,然後查詢以查看admin設置爲true。

編輯:使用let!(:admin)強制rspec立即創建記錄,而不是延遲加載(默認行爲)。當延遲加載工廠時,可能出現以下情況:管理員被調用:用戶,因此不是:admin

+0

謝謝你(byebug) –

相關問題