Я немного озадачен тем, что происходит со спецификациями контроллера скаффолдов, которые генерирует 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