2

ユーザー モデルの save メソッドをモックして false を返し、検証が失敗した場合にコントローラーが何をするかをシミュレートしようとしています。

私の仕様は次のようになります。

require 'spec_helper'

describe UsersController do
  describe 'POST create_email_user' do
    it 'responds with errors json if saving the model fails' do
      @params = {
        :last_name => 'jones',
        :email => 'asdfasdfasfd@'
      }
      User.stub(:new_email_user) .with(@params) .and_return(@mock_user)

      @mock_user.stub(:save) .and_return(false)

      post :create_email_user, :user => @params, :format => :json

      response.body.should == @mock_user.errors.as_json
      response.status.should == :unprocessable_entity
    end
  end
end

コントローラーのアクションは次のようになります。

class UsersController < ApplicationController
  def create_email_user
    @user = User.new_email_user(params[:user])
    if @user.save
      # code left out for demo purposes
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end
end

この仕様を実行すると、予想される new_email_user への呼び出しが間違った引数を取得したという基本的なエラーが表示されます。

  1) UsersController POST create_email_user responds with errors json if saving the model fails
     Failure/Error: post :create_email_user, :user => @params, :format => :json
       <User(id: integer, email: string, encrypted_password: string, reset_password_token: string, reset_password_sent_at: datetime, remember_created_at: datetime, sign_in_count: integer, current_sign_in_at: datetime, last_sign_in_at: datetime, current_sign_in_ip: string, last_sign_in_ip: string, created_at: datetime, updated_at: datetime, uid: string, provider: string, first_name: string, last_name: string, registration_id: integer, gender: string, authentication_token: string) (class)> received :new_email_user with unexpected arguments
         expected: ({:last_name=>"jones", :email=>"asdfasdfasfd@"})
              got: (["last_name", "jones"], ["email", "asdfasdfasfd@"])
        Please stub a default value first if message might be received with other args as well. 

Rails は has をキーと値のペアの配列に変換するようですが、私のコードはセットアップでストレート ハッシュを使用しているだけです。

この配列への変換をどのようにシミュレートできますか、それとも間違っていますか?

4

1 に答える 1

5

.withスタブはテストに実際には関係なく、問題を引き起こしているため、ユーザーにドロップします。

スタブがないと.with、引数に対してその値が返されます。そう:

User.stub(:new_email_user).and_return(@mock_user)

次に、次のことを保証する別の仕様があります。

User.should_receive(:new_email_user).with(@params)

そして、その問題を独自の狭い仕様で診断します。

于 2013-01-15T20:47:40.487 に答える