我在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 checkers,eq
是最弱的"但我本以为没有相同的课程会成为交易破坏者。
正如您所看到的,感谢Draper's matchers,我可以解决此问题。但我觉得我必须错过一些让测试失败的东西。
问题:
我应该使用什么样的相等匹配器才能通过should pass, but doesn't
测试?
答案 0 :(得分:1)
我认为你遇到了两个误解。
您要问的是测试网页是否已装饰。你不应该测试这个。相反,您应该测试装饰的结果,即行为。例如,如果装饰者应该添加一个新方法“foo”,那么测试“foo”方法是否按照你想要的方式工作。
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