2014-10-21 2 views
2

В моем тесте контроллера я проверяю, что правильное значение присваивается переменной экземпляра.RSpec eq matcher возвращает сбой, когда две вещи равны.

Когда я

expect(assigns(:conversations)).to eq @user_inbox

RSpec говорит мне:

Failure/Error: expect(assigns(:conversations)).to eq @user_inbox 

    expected: #<ActiveRecord::Relation [#<Mailboxer::Conversation id: 4, subject: "Dude, what up?", created_at: "2014-10-21 08:43:50", updated_at: "2014-10-21 08:43:50">]> 
     got: #<ActiveRecord::Relation [#<Mailboxer::Conversation id: 4, subject: "Dude, what up?", created_at: "2014-10-21 08:43:50", updated_at: "2014-10-21 08:43:50">]> 

    (compared using ==) 

    Diff: 

Я вижу, что нет никакой разницы между ожидаемым и фактическим. Я хотел бы знать, что вызывает этот тест.

ответ

4

ActiveRecord::Relation сравнивает на основе фактического отношения, а не результирующего набора. Например,

User.where(:id => 123) == User.where(:email => "[email protected]") 

вернет ложь, даже результаты запроса оба одинаковы, так как фактические запросы разные.

Я подозреваю, что вы больше заботитесь о результатах запроса, а не о том, как он был составлен, и в этом случае вы можете использовать to_a для преобразования отношения к массиву активных объектов записи. Обратите внимание, что Active Record определяет равенство, основанное только на значении атрибута id (со специальным случаем для несохраненных объектов).

0

Да, потому что это два объекта ActiveRecord::Relation. Ваш экземпляр переменной является первым один и создать еще один под названием conversations

Вы должны проверить количество строк или другого имущества, с чем-то вроде этого:

expect(assigns(:conversations).count).to eq @user_inbox.count 
0

Может быть, вы должны изменить стратегию тестирования.

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

вы должны дразнить ваш результат запроса

describe 'GET user conversations' do 
    before do 
    your_user.stub(:conversations).and_return "foo bar"  
    end 
    it 'assigns the conversations of the user' do 
    get :user_conversation 
    expect(assigns(:conversations)).to eq your_user.conversations 
    end 
end 

или вы должны проверить, что some_collaborator.should_receive (: some_methods)

describe 'GET user conversations' do 
    before do 
    some_collaborator.stub(:conversations) 
    end 
    it 'assigns the conversations of the user' do 
    some_collaborator.should_receive(:conversations) 
    get :user_conversation 
    end 
end 
Смежные вопросы