【问题标题】:How can I better test equality for decorated objects?如何更好地测试装饰对象的相等性?
【发布时间】:2014-12-30 04:51:03
【问题描述】:

我在使用 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 测试通过?

【问题讨论】:

  • eq 匹配器只是在对象上使用== 运算符,所以这不是真正的 RSpec 问题,而是 Draper 问题。
  • 如果你创建页面而不是构建呢?
  • @DavidGrayson 我同意。我希望有另一个平等匹配器适用于这种情况,但我认为不会。这可能就是 Draper 提供匹配器工作的原因。
  • @RustamA.Gasanov 不,同样的问题。我认为 David 的想法是正确的 - 这不是 Draper 的预期工作方式。

标签: ruby rspec draper


【解决方案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

【讨论】:

  • 1.该测试的代码是expect(decorated_page).to_not eq page - 如,我认为decorated_page 不应该等于page。该测试失败 - 例如,RSpec 事物 decorated_pagepage 是相等的。 2. 我有单独的装饰器测试,以确保装饰器上的方法按预期工作。此测试是为了确保首先应用装饰。
  • 我喜欢你对expect(decorated_page.object).to eq page 的想法——它测试了装饰是否发生,并且它发生在正确的对象上。谢谢!
  • 我添加了更多信息以便更好地解释 - 看看是否有帮助,如果您需要更多详细信息,请告诉我
猜你喜欢
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多