Задавая ручной вызов действительным? - PullRequest
1 голос
/ 31 мая 2009

Привет всем, я полностью потерян на этом.

Я нашел фрагмент кода онлайн, чтобы помочь проверять поля через 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 проверки извлекает пользователя на основании прошлого в имени пользователя "Макет" ошибки "получил неожиданное сообщение: [] с ( "Имя пользователя")

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

1 Ответ

1 голос
/ 31 мая 2009

Я не вижу 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

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...