2009-05-31 2 views
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 :: издевается :: MockExpectationError в 'UserController POST validate извлекает пользователя на основе прошлого в нас ername»Mock„ошибки“получил неожиданное сообщение: [] с („имя пользователя“)

Я не могу показаться, чтобы выяснить, как в мире, чтобы издеваться вызов user.errors [поле]. В идеале эта спецификация проверяет счастливый путь, никаких ошибок. Затем я напишу еще раз для подтверждения валидации.

ответ

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 

Ключ в том, что вам нужен пользователя издеваться реагировать на ошибки метода, возвращая либо пустой хэш или хеш FIELDNAME/ошибок. Альтернативой этому является использование одного из инструментов замены светильников. Я использую машинист прямо сейчас, что может привести к уменьшению всего этого:

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 
Смежные вопросы