2014-03-13 34 views
0

我是Rspec和水豚的新手。我得到的錯誤是從主頁導航參觀畫廊rspec:未定義方法`推薦書'爲零:NilClass

故障/錯誤:參觀root_path

NoMethodError:未定義的方法`推薦的零:NilClass

我試圖讓兩種不同的方法,以在規範中定義一個變量。我已經添加了他們兩個,所以我可以得到有關我在做什麼錯誤的反饋。

class WelcomeController < ApplicationController 
    def index 
     @event = Event.last 
     @event.testimonials.first ? @latest_testimonial = @event.testimonials.first.id : @latest_testimonial = nil 
    end 
end  

feature 'Navigation from homepage' do 

    before :each do 
     visit root_path 
     find('#nav-menu').find('h1').click #opens up navigation bar 
    end 

    scenario 'Visit Gallery' do 
     find('#nav-gallery').find('.no_bar').click 
     let(:event) {Event.last} #1st attempt at solving Rspec error. 
     let(:event) {mock_model(Event, id: 3, name: "Jack & Jill", date: "2004-06-10", created_at: "2014-03-10 02:57:45", updated_at: "2014-03-10 02:57:45")} #2nd attempt at solving Rspec error. 
     controller.stub(:event) 

     expect(page).to have_css 'img.photos' 
    end 
end 

回答

2

其他答案是正確的 - 在這裏基本上是相同的內容更簡單(或者可能只是通過解釋你已經知道的東西更多地抽出)。

您的測試所執行的第一件事是執行before區塊,該區塊訪問root_path,推測可能在WelcomeController上調用index操作。該方法所做的第一件事情是調用Event.last,它返回nil,因爲您的測試數據庫爲空,因此沒有最後一條記錄要返回。然後當您撥打@event時撥打testimonials,您會看到您看到的錯誤,因爲@eventnil

要解決該問題,您需要在導航到root_path並調用index操作之前,在數據庫中創建一個Event記錄。要做到這一點的一種方法是visit root_path之前添加此行:

Event.create(name: "Jack & Jill" [...]) 

這將在數據庫中創建一個記錄,所以Event.last會返回一些東西。

你也將擺脫let陳述和controller.stub事情。那些現在是不必要的(無論如何還有其他問題)。這應該足以讓代碼至少運行。

實際上,您不會發現像我在這裏展示的創建記錄是一種可持續的方法 - 這就是工廠(使用FactoryGirl之類的工具)或嘲笑/存根的地方。然後您使用let來定義這些項目僅在您的before塊中使用過一次,並且仍然將創建它們所花費的開銷限制在實際使用它們的後續測試中。

無論如何,最重要的一點是,在開始觸發控制器操作(假定存在這些對象)之前,需要完成對象的設置(以及需要的記錄)。

+0

在功能測試不良練習中使用嘲笑/存根(stub)嗎?我已經提前按照建議實施了Factory Girl。 – ltrainpr

+0

我自己的偏好是在集成測試中使用持久對象,但我並不認爲我的意見很多。請注意,使用FactoryGirl,您可以構建對象的存根版本,以避免碰到不希望這樣做的db。 –

1

Event.last返回零。

這樣做的典型(也是最簡單的)方法是在測試中創建事件,然後嘗試訪問該站點,然後控制器將使用它。功能規格應該確實包含最少量的嘲諷和存根 - 它們代表真正的用戶與系統進行交互。

你的存根沒有被使用(事實上它們本身就是錯誤的)。事實證明,你的錯誤在他們被設置之前即將到來。

相關問題