rSpec == / eql не может сравнивать «одинаковые» вещи - PullRequest
3 голосов
/ 08 сентября 2011

У меня есть тестовый индекс контроллера, который получает область ActiveRecord.В настоящее время тест выглядит следующим образом (включая некоторые встроенные средства отладки):

describe "GET index" do
  it "assigns all schools as @schools" do
    get :index
    puts assigns(:schools).class
    puts School.populated.class
    assigns(:schools).should == School.populated
  end
end

Вывод такой:

ActiveRecord::Relation
ActiveRecord::Relation

expected: []
     got: [] (using ==)
Diff:

Это определенно не первый раз, когда я имел этопоследние версии Rails и rSpec.Ранее коллега просто оборачивал элементы в to_a, чтобы сравнить их, что, на мой взгляд, немного грязно и, вероятно, не является хорошим решением.

Есть идеи?Мне любопытно, почему он думает, что они разные, и как этот же тест прошел в старых версиях Rails и / или rSpec.

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

Если вы хотите сравнить массивы, вы должны написать

 assigns(:schools).all.should =~ School.populated.all
1 голос
/ 08 сентября 2011

eql совпадает с == . Только автор Rspec talk не использует ! = , вместо него

следует использовать should_not
actual.should == expected
#is interpreted as this:

actual.should.==(expected)

#This is not true for !=. Ruby interprets this: actual.should != expected
#as follows:

!(actual.should.==(expected))

Обновление : Relation предоставляет шаблон Lazy Load, поэтому у вас нет выполненного запроса на шаге. Это означает запуск запроса по первому запросу

...