Что здесь происходит: rspec stub (: new) .with ...? - PullRequest
8 голосов
/ 16 мая 2011

Я немного озадачен тем, что происходит со спецификациями контроллера скаффолдов, которые генерирует rspec. Казалось, это имело смысл, пока я не добавил авторизацию в свое приложение, и теперь мне нужно обновить свои тесты.

MyClass.stub(:new).with('these' => 'params') { mock_my_class(:save => true) }

В моем контроллере я сливаю хэш в params при создании новой записи (для этого нужен действующий идентификатор current_user). MyClass.new (params [: my_class] .merge (: user_id => current_user.id))

Тест не пройден

expected: ({"these"=>"params"})
got: ({"these"=>"params", "user_id"=>315})

Имеет смысл, что тест не пройден, поскольку новый метод получает параметры, которых он не ожидал. Он ожидал получить {'these' => 'params'}, но фактически получил {'these' => 'params', 'user_id' => 1234}

Поэтому моя естественная реакция - настроить тест, потому что новый метод должен получить {'these' => 'params', 'user_id' => 1234} и вернуть фиктивный объект.

Поэтому я добавляю к тесту следующее:

   MyClass.stub(:new).with({'these' => 'params', 'user_id' => @user.id}) { mock_my_class(:save => true) }   

Здесь меня бросают через петлю. Результат теста следующий:

expected: ({"these"=>"params", "user_id"=>298})
got: ({"these"=>"params"})

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

Любая помощь? :)

Примечание:

Сайт rspec сообщает следующее:

Account.should_receive(:find).with("37").and_return(account)

или

Account.stub!(:find).and_return(account)

Это достаточно просто, просто кажется странным, что созданный каркас не будет содержать эти методы (если я не испортил что-то, что возможно (:)


Проходы

login_admin
describe "with valid params" do
  it "assigns a newly created forum_sub_topic as @forum_sub_topic" do
    ForumSubTopic.stub(:new) { mock_forum_sub_topic(:save => true) }
    ForumSubTopic.should_receive(:new).with({"these"=>"params", "user_id"=> @admin.id})  #PASS!
    post :create, :forum_sub_topic => {'these' => 'params'}
    assigns(:forum_sub_topic).should be(mock_forum_sub_topic) #PASS!
  end
end

Сбой

login_admin
describe "with valid params" do
  it "assigns a newly created forum_sub_topic as @forum_sub_topic" do
    ForumSubTopic.stub(:new).with({'these' => 'params', 'user_id' => @user.id}) { mock_forum_sub_topic(:save => true) } 
    post :create, :forum_sub_topic => {'these' => 'params'}
    assigns(:forum_sub_topic).should be(mock_forum_sub_topic)
  end
end

1 Ответ

4 голосов
/ 17 мая 2011

«Никогда не доверяй наркоману», как говорится. Можно также сказать: «Никогда не доверяй эшафоту».

Хорошо, это немного слишком резко. Скаффолд делает все возможное, чтобы выяснить, какие параметры будут работать для моделей / контроллеров, которые вы генерируете, но он не знает о вложенных ресурсах (что, как я полагаю, вы используете), поэтому он не будет генерировать * 1003. * в хэше params. Добавьте это:

post :create, :forum_sub_topic => {:user_id=>@user.id}

Ключ these_params генерируется в качестве примера - удалите его и добавьте все параметры, необходимые для контроллера для создания MyClass.

Относительно опции with: stub и should_receive будут выводить только сообщения, которые удовлетворяют указанным условиям, т. Е. Если вы выполните:

MyClass.stub(:new) {mock_model(MyClass,:save=>true)}

Тогда MyClass ответит на любое сообщение new с помощью макета. Если, с другой стороны, вы делаете:

MyClass.stub(:new).with({:bogus=>37}) {mock_model(MyClass,:save=>true)}

Тогда MyClass будет отвечать на new только тогда, когда он также получит {:bogus=>37} в качестве аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...