Ответ 1
technicalpickles в #rspec помогли мне...
assigns(:client).should be_kind_of(Client)
Я пытаюсь проверить, что новое действие в моем контроллере RESTful настраивает переменную экземпляра требуемого типа объекта. Кажется довольно типичным, но с трудностью выполнить его
Клиентский контроллер
def new
@client = Client.new
end
Test
describe "GET 'new'" do
it "should be successful" do
get 'new'
response.should be_success
end
it "should create a new client" do
get 'new'
assigns(:client).should == Client.new
end
end
Результаты в...
'ClientsController GET 'new' should create a new client' FAILED expected: #, got: # (using ==)
Скорее всего, потому, что он пытается сравнить 2 экземпляра активной записи, которые отличаются. Итак, как я могу проверить, что контроллер настроил переменную экземпляра, содержащую новый экземпляр модели клиента.
technicalpickles в #rspec помогли мне...
assigns(:client).should be_kind_of(Client)
Вы можете использовать Rails new_record? метод проверки того, был ли данный экземпляр сохранен в базе данных уже или нет:
assigns(:client).should be_a(Client)
assigns(:client).should be_new_record
(Вы не можете использовать назначения [: клиент] по историческим причинам, в соответствии с: http://guides.rubyonrails.org/testing.html#the-four-hashes-of-the-apocalypse)
Для этого синтаксиса RSpec v3 2016:
expect(assigns(:client)).to be_a(Client)
Кроме того, для других, которые могут остановиться здесь из-за названия вопроса, вот как проверить, была ли установлена переменная экземпляра @client
на что-либо
# in controller action
@client = Client.find_by(name: "John")
# spec assignment based on collection membership
expect(assigns.keys).to include('client')
Обратитесь к @Attila Györffy answer о том, почему к хэшам присваивания нужно обращаться со строковыми клавишами.