Подтвердить что ты не робот

Как протестировать экземплярную переменную в контроллере с RSpec

Я пытаюсь проверить, что новое действие в моем контроллере 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 экземпляра активной записи, которые отличаются. Итак, как я могу проверить, что контроллер настроил переменную экземпляра, содержащую новый экземпляр модели клиента.

4b9b3361

Ответ 1

technicalpickles в #rspec помогли мне...

assigns(:client).should be_kind_of(Client)

Ответ 2

Вы можете использовать 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)

Ответ 3

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