2014-11-03 22 views
0

控制器:測試失敗,如果:Rspec的受讓人失敗上增加更多的代碼

def index 
    @products = Product.all 
    @products.present? ? @no_products_found = "" : @no_products_found = "No Products available." 
end 

失敗消息: 預期:2 得到:0

(compared using ==) 

Rspec的:

it "assigns products" do 
    get :index 
    FactoryGirl.create(:product, name: "product 1") 
    FactoryGirl.create(:product, name: "product 2") 
    expect(assigns(:products).size).to eq(2) 
end 

如果我將動作更改爲:

def index 
    @products = Product.all 
end 

PS:新的導軌。感謝您的輸入。

+0

什麼是您從RSpec獲得確切的失敗消息? – 2014-11-03 17:19:48

+0

預計:2得到:0(使用==比較) – AdRoiT 2014-11-03 17:22:01

+1

你正在清理你的數據庫嗎?我希望'get:index'行之前的'FactoryGirl'行。 – BookOfGreg 2014-11-03 17:24:34

回答

1

你需要做get之前調用FactoryGirl.create。當然,記錄必須在提出請求之前存在。

it "assigns products" do 
    FactoryGirl.create(:product, name: "product 1") 
    FactoryGirl.create(:product, name: "product 2") 
    get :index 
    expect(assigns(:products).size).to eq(2) 
end 

雖然我親自做的規範一點更加明確:

it "assigns products" do 
    get :index 
    products = [ 
     FactoryGirl.create(:product, name: "product 1"), 
     FactoryGirl.create(:product, name: "product 2") 
    ] 
    expect(assigns(:products)).to eq(products) 
    end 
end 

再有就是你的控制器動作的另一個問題。應謹慎使用三元條件運算符,在這種情況下,我強烈建議不要使用它,因爲它會妨礙可讀性。這條線:

@products.present? ? @no_products_found = "" : @no_products_found = "No Products available." 

應該再次寫成

@no_products_found = @products.present? ? "" : "No Products available." 

甚至

@no_products_found = if @products.present? 
         "" 
        else 
         "No Products available." 
        end 

,我個人不喜歡亂用這種簡單的觀點的邏輯我的控制器動作。也許它只用在一個地方,所以我的解決方案將完全位於視圖層:

<% if @products.present? %> 
    <% @products.each do |product| %> 
    <!-- Render products --> 
    <% end %> 
<% else %> 
    No products available. 
<% end %> 
+0

哇,謝謝!這很有幫助。 – AdRoiT 2014-11-03 17:33:01

+0

一個稍微偏離主題的問題 - 如果我在視圖中添加邏輯,那麼,如果頁面顯示「沒有產品可用」,我將如何測試。或不。我嘗試了should_have_content,但這並不像預期的那樣工作 – AdRoiT 2014-11-03 17:42:37

+0

您可以對呈現的主體執行斷言,例如'expect(response.body).to include('No results found')'。您可能還想看看水豚的功能規格。這些測試可以在後臺啓動一個真實的網絡瀏覽器來模擬用戶交互。它們非常適合端到端測試,但我喜歡僅僅爲了核心功能而少數幾個,因爲它們往往會變慢。 – 2014-11-03 21:49:44

1

這是因爲您在調用索引方法後創建產品。更改規格,以這樣的:

it "assigns products" do 
    FactoryGirl.create(:product, name: "product 1") 
    FactoryGirl.create(:product, name: "product 2") 
    # created products above and then make call to index: 
    get :index 
    expect(assigns(:products).size).to eq(2) 
end 
+0

甜,我剛剛發現並準備發佈答案。但是,爲什麼它通過第一種情況? – AdRoiT 2014-11-03 17:27:07

+0

@AdRoiT:我很抱歉,但我沒有看到您的帖子上寫有任何其他案例。你想寫嗎? – Surya 2014-11-03 17:28:47

+0

當我定義索引def index時,運行相同的測試 @products = Product.all end – AdRoiT 2014-11-03 17:39:03