2015-05-20 204 views
0

我有以下的RSpec測試:控制器是在無RSpec的測試

require 'rails_helper' 
require 'spec_helper' 

RSpec.describe "Users", type: :request do 


    describe "sign in/out" do 

    describe "success" do 
     it "should sign a user in and out" do 
     attr = {:name=>"Test1", 
     :email => "[email protected]", 
     :password => "foobar", 
     :password_confirmation => "foobar" 
     } 
     user = User.create(attr) 
      visit signin_path 
     fill_in "Email", :with => user.email 
     fill_in "Password", :with => user.password 
     puts page.body 
     click_button "Sign in" 
     controller.should be_signed_in 
     click_link "Sign out" 
     controller.should_not be_signed_in 
     end 
    end 
    end 

end 

我收到以下錯誤:

Failure/Error: controller.should be_signed_in 
    expected to respond to `signed_in? 

這是因爲controllernil。這裏有什麼不對,導致controllernil

Controller類是:

class SessionsController < ApplicationController 
    def new 
    @title = "Sign in" 
    end 
    def create 
    user = User.authenticate(params[:session][:email], 
          params[:session][:password]) 
    if user.nil? 
     flash.now[:error] = "Invalid email/password combination." 
     @title = "Sign in" 
     render 'new' 
    else 
     sign_in user 
     redirect_to user 
    end 
    end 
    def destroy 
    sign_out 
    redirect_to root_path 
    end 
end 

signed_in方法,其中包括會話輔助限定。

Ruby平臺信息: 紅寶石:2.0.0p643 的Rails 4.2.1 RSpec的:3.2.2

回答

4

這是一個被設計成跨越多個請求規格(這基本上是一個軌道集成測試)請求,可能跨控制器。

controller變量由請求方法是集成測試(getputpost等)

相反,如果你使用水豚DSL(瀏覽,點擊等),那麼集成測試方法從未設置被叫,因此controller將爲零。當使用水豚時,您無法訪問單個控制器實例,因此您無法測試諸如signed_in?返回的內容 - 您必須測試更高級別的行爲(例如,頁面上顯示的內容)。

+0

我將此測試用例移至控制器測試用例。 – doptimusprime