2

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 の matchers のおかげで、このケースの回避策があります。しかし、そのテストが失敗するためには、何かが欠けているに違いないと感じています。

質問:

should pass, but doesn'tテストに合格するには、どの等価マッチャーを使用すればよいですか?

4

1 に答える 1

1

2 つの誤解に遭遇していると思います。

  1. ページが装飾されているかどうかのテストについて質問しています。これをテストするべきではありません。代わりに、装飾の結果、つまり動作をテストする必要があります。たとえば、デコレーターが新しいメソッド「foo」を追加することになっている場合、「foo」メソッドが希望どおりに機能することをテストします。

  2. Draper デコレータはmodel.decorate == model. これにより、意図的に装飾がテスト コードから「見えなくなり」ます。たとえば、expect(decorated_page).to eq pageRSpec が==比較に を使用しているため、Draper がインターセプトしているため、成功し==ます。これが、「合格するはずだが、合格しない」という仕様がそのままの動作をしている理由です。

装飾がページに発生したことを本当にテストしたい場合は、これを試してください。

expect(decorated_page.object).to eq page

装飾されたページがページとは異なることを本当にテストしたい場合は、これを試してください。

expect(decorated_page.object_id).to_not eq page.object_id
于 2014-12-30T06:06:51.627 に答える