2009-05-31 5 views
1

こんにちは、私は完全にこの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 :: MockExpectationError で'UsersController POST は、過去に基づいてユーザーを取得します ( 『ユーザ名』)私は世界でuser.errorsへの呼び出し[フィールド]を模擬する方法を見つけ出すように見えることはできません

で[]:ername」モック 『のエラーが』 予期しないメッセージを受信しました。理想的には、この仕様はハッピーパスをテストし、エラーはありません。私は検証の失敗のために別のものを書きます。

答えて

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 

キーを使用すると、空のハッシュやフィールド名/エラーのハッシュのいずれかを返すことによって、エラーの方法に対応するために、あなたのユーザーモックを必要とするということです。これに代わるものは、治具交換ツールの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 
関連する問題