如何更好地测试装饰对象的相等性?

时间:2014-12-30 04:51:04

标签: ruby rspec draper

我在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有few different equality checkerseq是最弱的"但我本以为没有相同的课程会成为交易破坏者。

正如您所看到的,感谢Draper's matchers,我可以解决此问题。但我觉得我必须错过一些让测试失败的东西。

问题:

我应该使用什么样的相等匹配器才能通过should pass, but doesn't测试?

1 个答案:

答案 0 :(得分:1)

我认为你遇到了两个误解。

  1. 您要问的是测试网页是否已装饰。你不应该测试这个。相反,您应该测试装饰的结果,即行为。例如,如果装饰者应该添加一个新方法“foo”,那么测试“foo”方法是否按照你想要的方式工作。

  2. Draper装饰器制作model.decorate == model。这故意使装饰“看不见”以测试代码。例如,expect(decorated_page).to eq page将成功,因为RSpec使用==进行比较,然后Draper正在拦截==。这就是为什么你的规范说“应该通过,但不会”,就像它的行为一样。

  3. 如果您确实想测试页面上的装饰,请尝试以下操作:

    expect(decorated_page.object).to eq page
    

    如果您确实想测试装饰页面与页面的不同,请尝试以下操作:

    expect(decorated_page.object_id).to_not eq page.object_id