2016-04-13 4 views
3

Это очень простой вопрос, но я не могу найти для этого решения. Прошло 3 дня. Пожалуйста помоги.RSpec для instance_variable в Index

Так что у меня это в

users_controller.rb

def index 
    @users = @users.normal.order(:name).page params[:page] 
end 

Так что у меня это в моем users_controller_spec.rb

it "assign all normal users to @users" do 
    users = User.normal.all 
    get :index 
    expect(assigns(:users)).to eq(users) 
end 

Мой код основан с https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs.

После запуска rspec в моем терминале это выход.

Diff: 
    @@ -1,4 +1,4 @@ 
    -[#<User:0x00000004aa32b0 
    +[#<User:0x00000004a085a8 
     id: 2, 
     name: "Christian Galamay", 
     admin: false, 
    @@ -20,7 +20,7 @@ 
     updated_at: Wed, 13 Apr 2016 01:46:17 UTC +00:00, 
     role: "Normal", 
     avatar: nil>, 
    - #<User:0x00000004aa2ea0 
    + #<User:0x000000049dbd78 
     id: 3, 
     name: "Grace Sojor", 
     admin: false, 
    @@ -42,7 +42,7 @@ 
     updated_at: Wed, 13 Apr 2016 01:46:17 UTC +00:00, 
     role: "Normal", 
     avatar: nil>, 
    - #<User:0x00000004aa2ab8 
    + #<User:0x000000049db760 
     id: 4, 
     name: "Karl Pandacan", 
     admin: false, 

Выходные данные означают, что все значения одинаковы, кроме как с шестнадцатеричным после пользователя. Поэтому мой вопрос: (1) Почему шестнадцатеричный текст после пользователя включен в сравнение двух ActiveRecord (2). Есть ли какой-либо метод или функция для игнорирования шестнадцатеричного кода в User. Спасибо

ответ

2

Выход немного вводит в заблуждение. 2 вещи не равны, потому что они являются объектами отношения, а == между двумя объектами ActiveRecord::Relation работает, сравнивая сгенерированный sql. В вашем случае отношения не равны: в контроллере вы разбиваете на страницы и устанавливаете порядок.

Rspec пытается быть полезной, показывая разность to_s вывода из двух объектов, однако это заканчивает сравнение результата запроса (который действительно является одним и тем же объектом), и поэтому единственная разница, которую он находит в этой строке вывод - это идентификаторы объектов. Это отчасти удача - без предложения заказа объекты могли быть возвращены в другом порядке. Чтобы быть явным: показанный на нем вывод о различиях просто помогает вам, это не значит, что именно так было проведено сравнение rspec.

Если то, что вы хотите, чтобы сравнить результаты запроса, то вы можете использовать to_a, чтобы сделать это:

expect(assigns(:users)).to eq(users.to_a) 

Если вы не заботитесь о заказе вы можете также сделать

expect(assigns(:users)).to match_array(users) 

Это немного другое испытание: оно не сработает, если db решит вернуть результаты в другом, что возможно, как я упоминал выше.

+0

Я уже добавляю to_a, и он тестирует :) –

3

вы можете просто проверить массив пользователей вместо активной записи отношения

expect(assigns(:users).to_a).to eq(users.to_a) 
2

Ваши массивы равноценны, однако ваш спецификации не удается, потому что вы сравниваете равенство ссылок, а не значение равенства, так как ваш контроллер загружает пользователей в отдельную переменную, чем ваши спецификации.

Try Сравнивая значения вашей коллекции с помощью as_json:

expect(assigns(:users).as_json).to eq(users.as_json) 
+0

Неверное объяснение: 'eq' сравнивает, используя' == 'not' equal? ​​' –

+0

Я пытаюсь добавить to_a, и он уже проходит. спасибо :) –

 Смежные вопросы

  • Нет связанных вопросов^_^