Как я могу лучше проверить равенство для украшенных объектов?

У меня возникают проблемы с сопоставлением равенства в декорированных объектах RSpec и Draper.

Спецификации, чтобы показать, что происходит:

context 'how to use the right equality matcher' do
  let(:page) { build(:page) }
  let(:decorated_page) { page.decorate }

  it "should pass, but doesn't" do
    expect(decorated_page).to_not eq page
  end

  it 'proves the classes are different' do
    expect(decorated_page).to be_a PageDecorator
    expect(page).to be_a Page
    expect(decorated_page.class).to_not eq page.class
  end

  it 'has a work around' do
    expect(decorated_page).to be_decorated_with PageDecorator
    expect(page).to_not be_decorated_with PageDecorator
  end
end

Я знаю, что в RSpec есть несколько различных средств проверки на равенство, и что eq является «самый слабый», но я бы подумал, что отсутствие одного и того же класса будет нарушителем условий сделки.

Как видите, у меня есть обходной путь для этого случая благодаря сопоставителям Draper. Но я чувствую, что должен что-то упустить, чтобы этот тест провалился.

Вопрос:

Какой сопоставитель равенства я должен использовать, чтобы пройти тест should pass, but doesn't?


person Lucy Bain    schedule 30.12.2014    source источник
comment
Сопоставитель eq просто использует оператор == для объектов, так что на самом деле это не проблема RSpec, а проблема Draper.   -  person David Grayson    schedule 30.12.2014
comment
что, если вы создадите страницу вместо сборки?   -  person Rustam A. Gasanov    schedule 30.12.2014
comment
@DavidGrayson Я согласен. Я надеялся, что для этого случая подойдет другой сопоставитель равенства, но думаю, что нет. Вероятно, поэтому Draper обеспечивает работу с сопоставлениями.   -  person Lucy Bain    schedule 30.12.2014
comment
@RustamA.Gasanov Нет, та же проблема. Я думаю, что у Дэвида есть правильное представление - это не то, как Дрейпер должен работать.   -  person Lucy Bain    schedule 30.12.2014


Ответы (1)


Я думаю, что вы столкнулись с двумя недоразумениями.

  1. Вы спрашиваете о проверке того, оформлена ли страница или нет. Вы не должны проверять это. Вместо этого вы должны проверить результат украшения, то есть поведение. Например, если декоратор должен добавить новый метод "foo", проверьте, что метод "foo" работает так, как вы хотите.

  2. Декоратор Draper делает model.decorate == model. Это намеренно делает украшение «невидимым» для кода тестирования. Например, expect(decorated_page).to eq page будет успешным, поскольку RSpec использует для сравнения ==, а Draper перехватывает ==. Вот почему ваша спецификация, которая говорит «должна пройти, но не проходит», ведет себя так, как есть.

Если вы действительно хотите проверить, что украшение произошло на странице, попробуйте следующее:

expect(decorated_page.object).to eq page

Если вы действительно хотите проверить, что украшенная страница отличается от страницы, попробуйте следующее:

expect(decorated_page.object_id).to_not eq page.object_id
person joelparkerhenderson    schedule 30.12.2014
comment
1. код для этого теста expect(decorated_page).to_not eq page - я думаю, что decorated_page не должно равняться page. Этот тест терпит неудачу - как в RSpec, вещи decorated_page и page равны. 2. У меня есть отдельные тесты декоратора, чтобы убедиться, что методы декоратора работают должным образом. Этот тест должен убедиться, что украшение нанесено в первую очередь. - person Lucy Bain; 30.12.2014
comment
Мне нравится ваша идея для expect(decorated_page.object).to eq page — она проверяет, произошло ли украшение и произошло ли оно на правильном объекте. Спасибо! - person Lucy Bain; 30.12.2014
comment
Я добавил больше информации, чтобы лучше объяснить - посмотрите, поможет ли это, и дайте мне знать, если вам нужна дополнительная информация. - person joelparkerhenderson; 30.12.2014