Каковы правильные параметры для запроса rspec на мою заглушку - PullRequest
4 голосов
/ 27 мая 2011

У меня есть спецификация контроллера, и я получаю следующее неудавшееся ожидание:

 Failure/Error: put :update, :id => login_user.id, :user => valid_attributes
   #<User:0xbd030bc> received :update_attributes with unexpected arguments
     expected: ({:name=>"changed name", :email=>"changed@mail.com", :password=>"secret", :password_confirmation=>"secret"})
          got: ({"name"=>"Test user", "email"=>"user@test.com", "password"=>"secret", "password_confirmation"=>"secret"})

И для меня это выглядит так, будто я передаю "name" => "Test User" и ожидаю :name => "test user"

моя спецификация выглядит так:

    describe 'with valid parameters' do
      it 'updates the user' do
       login_user = User.create!(valid_attributes)
       controller.stub(:current_user).and_return(login_user)
       User.any_instance.
          should_receive(:update_attributes).
          with(valid_attributes.merge(:email => "changed@mail.com",:name=>"changed name"))
       put :update, :id => login_user.id, :user => valid_attributes
      end 
end

и у меня есть что-то вроде этого для моих действительных атрибутов:

    def valid_attributes
  {
    :name => "Test user",
    :email=> "user@test.com",
    :password => "secret",
    :password_confirmation => "secret"

  }
end

, так что не так с моими параметрами, какие-либо предложения?

Я использую Rails 3.0.5 с rspec 2.6.0 ...

1 Ответ

8 голосов
/ 27 мая 2011

Сообщение об ошибке точно сообщает, что происходит: любой экземпляр User ожидает update_attributes с хешем, включая :email => "changed@mail.com", но получает :email => "user@test.com", потому что это то, что находится в valid_attributes.Точно так же он ожидает :name => "changed_name", но получает :name => "Test user", потому что это то, что в valid_attributes.

. Вы можете упростить этот пример и избежать этой путаницы.Здесь нет необходимости использовать valid_attributes, потому что should_receive все равно перехватывает вызов update_attributes.Обычно я делаю это так:

controller.stub(:current_user).and_return(mock_model(User)) # no need for a real user here
User.any_instance.
  should_receive(:update_attributes).
  with({"these" => "params"})
put :update, :id => login_user.id, :user => {"these" => "params"}

Таким образом, ожидаемые и фактические значения верны в примере, и становится ясно, что на самом деле не имеет значения, что они есть: какой бы хэш не передавался как1017 * передается непосредственно update_attributes.

Имеет смысл?

...