サインアップが成功すると、次のコントローラーコードによって成功テンプレートがレンダリングされる条件をテストしようとしています。
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:
成功ビューは、アクションなしでビュー/ユーザー/に保存されるテンプレートです。私は非常に根本的な間違いを犯していると推測しており、いくつかの助けが必要です。
テストで@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