Как проверить экземпляр переменной был создан в контроллере с RSpec - PullRequest
34 голосов
/ 12 января 2010

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

Ответы [ 3 ]

37 голосов
/ 12 января 2010

технические соленья в #rspec помогли мне ...

assigns(:client).should be_kind_of(Client)
15 голосов
/ 11 января 2011

Вы можете использовать Rails 'new_record? метод проверки, был ли данный экземпляр уже сохранен в базе данных или нет:

assigns(:client).should be_a(Client)
assigns(:client).should be_new_record

(Вы не можете использовать assign [: client] по историческим причинам, согласно: http://guides.rubyonrails.org/testing.html#the-four-hashes-of-the-apocalypse)

14 голосов
/ 20 апреля 2016

Для этого синтаксиса 2016 RSpec v3 используйте:

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')

См. @ ответ Аттилы Дьёрффи о том, почему хэш назначений должен быть доступен с помощью строковых ключей.

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