2009-05-31 17 views
1

Hey alle, ich bin auf diesem einen völlig verloren.Einen manuellen Anruf auf gültig setzen?

Ich habe ein Code-Snippet online gefunden, um Felder mithilfe von Ajax zu validieren, während der Benutzer in sie eintippt. Also versuche ich eine Spezifikation gegen einen Teil davon zu schreiben und ich kann es einfach nicht durchgehen lassen.

Hier ist der Code

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 

und hier ist mein Test so weit

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 

ich diesen Fehler -

1) Spec :: Mocks :: MockExpectationError in 'UsersController POST validate ruft den Benutzer basierend auf der Vergangenheit in uns ab ername‘Mock 'Fehler' erhielten unerwartete Nachricht: [] mit ("username")

ich nicht scheinen, um herauszufinden kann, wie in der Welt den Ruf zu user.errors zu verspotten [field]. Idealerweise testet diese Spezifikation den glücklichen Pfad, keine Fehler. Ich schreibe dann einen anderen für einen Validierungsfehler.

Antwort

1

Ich sehe nicht mock_user. Hier ist ein Schuss auf ihn:

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 

Der Schlüssel ist, dass Sie Ihren Benutzer Mock müssen die Fehler-Methode reagieren, indem sie entweder einen leeren Hash oder einen Hash von Feldname/Fehler zurück. Eine Alternative dazu ist die Verwendung eines der Fixture Replacement Tools. Ich benutze gerade den Maschinisten, der das Ganze vielleicht reduzieren könnte: