1

こんにちは、私はこれで完全に迷っています。

ユーザーがフィールドに入力するときに ajax を介してフィールドを検証するのに役立つコード スニペットをオンラインで見つけました。そのため、その一部に対して仕様を書こうとしていますが、合格することができません。

これがコードです

def validate
  field = params[:field]
  user = User.new(field => params[:value])
  output = ""
  user.valid?
  if user.errors[field] != nil
    if user.errors[field].class == String
      output = "#{field.titleize} #{user.errors[field]}" 
    else
      output = "#{field.titleize} #{user.errors[field].to_sentence}" 
    end
  end
  render :text => output
end

ここに私のテストがあります

  describe "POST validate" do
    it "retrieves the user based on the past in username" do
      mock_errors ||= mock("errors")
      mock_errors.stub!(:[]).and_return(nil)
      User.should_receive(:new).with({'username'=>"UserName"}).and_return(mock_user)
      mock_user.should_receive(:valid?).and_return(true)
      mock_errors.should_receive(:[]).with("username").and_return(nil)
      put :validate, :field=>'username', :value=>'UserName'      
      response.should == ""
    end
  end

このエラーが発生します-

1) Spec::Mocks::MockExpectationError の 'UsersController POST validate は、ユーザー名の過去に基づいてユーザーを取得します'

user.errors[field] への呼び出しをモックする方法がまったくわからないようです。理想的には、この仕様はハッピー パスをテストし、エラーはありません。次に、検証の失敗について別のことを書きます。

4

1 に答える 1

1

mock_user が表示されません。ここでそれを見てみましょう:

describe "POST validate" do
  it "retrieves the user based on the past in username" do
    mock_errors = mock("errors")
    mock_user = mock("user")
    mock_user.stub!(:errors).and_return([mock_errors])
    mock_errors.stub!(:[]).and_return(nil)
    User.should_receive(:new).with({'username'=>"UserName"}).and_return(mock_user)
    mock_user.should_receive(:valid?).and_return(true)
    mock_errors.should_receive(:[]).with("username").and_return(ActiveRecord::Errors.new({}))
    put :validate, :field=>'username', :value=>'UserName'      
    response.should == ""
  end
end

重要なのは、User モックが空のハッシュまたはフィールド名/エラーのハッシュを返すことによってエラー メソッドに応答する必要があるということです。これに代わる方法は、フィクスチャ交換ツールの 1 つを使用することです。私は現在機械工を使用しています。これにより、この全体が次のように削減される可能性があります。

describe "POST validate" do
  it "retrieves the user based on the past in username" do
    @user = User.make{'username'=>"UserName"}
    @user.should_receive(:valid?).and_return(true)
    @user.errors.should_receive(:[]).with("username").and_return(ActiveRecord::Errors.new({}))
    put :validate, :field=>'username', :value=>'UserName'      
    response.should == ""
  end
end
于 2009-05-31T18:48:27.503 に答える