2010-09-28 101 views
14

我試着去測試,其中在成功註冊成功的模板由以下控制器代碼Rspec的測試模板被渲染


def create 
    @user = User.new(params[:user]) 
    if @user.save 
     render :template => "success" 
    else 
     flash[:notice] = "Oops Somethings not quite right! :(" 
     render :action => "new" 
    end 
    end 
 

我使用以下規範來測試這個代碼


before(:each) do 
    @user = User.new 
    @user.attributes = valid_attributes  
    @params = valid_attributes 
    @user.stub!(:save).and_return(true) 
    end 


    def do_post 
    post :create 
    end 


    it "should create new user " do 
    count = User.count 
    do_post 
    user = User.new(@params)  
    user.save.should eql(true) 
    User.count.should eql(count + 1) 

    end 

    it "should render the success page on successful signup" do 
    do_post 
    @user.save 
    response.should render_template("success") if @user.save 
    end 
渲染的條件

但這個例子失敗「它應該在成功註冊成功渲染頁面」與此錯誤消息


1) 
'UsersController handling POST /users should render the success page on successful signup' FAILED 
expected "success", got "users/new.html.erb" 
./spec/controllers/users_controller_spec.rb:67: 
 

成功視圖是存儲在views/users /中的模板,無需執行任何操作。我猜我即將犯一個非常根本的錯誤,並希望得到一些幫助。

+0

我會刪除user.save條件最後一個斷言。 – Rimian 2013-04-15 02:27:23

回答

24

您正在測試@user變量,但控制器將實例化一個新實例,因此該存根將不會到位。

在這種情況下使用存根不是一個好主意,只是爲了模擬成功的保存調用。你爲什麼不提供有效的數據,並確保行動是成功的?

以下代碼適用於RSpec> 2.1並且它使用expect語法。

before(:each) do 
    @params = valid_attributes 
end 

it "should create new user" do 
    @_before = User.count 
    post :create, :user => @params 

    expect(assigns(:user)).to_not be_new_record 
    expect(User.count).to eq(@_before + 1) 
end 

it "should render the success page on successful signup" do 
    post :create, :user => @params 

    expect(response).to be_successful 
    expect(response).to render_template("success") 
end 

最後,改變

render :template => "success" 

render :action => "success" 

對於以前的RSpec版本,或者如果你有使用should語法,使用

before(:each) do 
    @params = valid_attributes 
end 

it "should create new user" do 
    @_before = User.count 
    post :create, :user => @params 

    assigns(:user).should_not be_new_record 
    User.count.should == (@_before + 1) 
end 

it "should render the success page on successful signup" do 
    post :create, :user => @params 

    response.should be_successful 
    response.should render_template("success") 
end 
+1

就是這樣。我剛剛得到它。謝謝。我仍然在與Rspec合作的過程中。非常感謝你。 – Sid 2010-09-28 09:01:10