0

Notification以下の仕様では、インスタンスに対して、破壊的なメソッドを実行すると列が true#mark_as_dismissedに変更されることをテストしたいと思います。has_been_readテストを素晴らしく簡潔に保ちながら、どのようにそれを行うのですか?

context "#mark_as_dismissed" do
  subject { create(:notification) }
  subject.mark_as_dismissed # How do I specify this
  its(:has_been_read) { should be_true }
end
4

1 に答える 1

3

テストを書く方法は複数あり、推奨される構文も異なるため、これは非常に独断的な回答です。

あなたのスタイルに従うと、次のようになります。

describe "#mark_as_dismissed" do
  subject { create(:notification) }
  before { subject.mark_as_dissmissed }

  its(:has_been_read) { should be_true }
end

私の場合は次のようになります。

describe "#mark_as_dismissed" do
  let(:notification) { create(:notification) }

  it "marks the notification as read" do
    notification.mark_as_dissmissed
    notification.has_been_read.should be_true
  end
end

syntatic sugar : Rspec では、ブール値を返すメソッドに特別な構文を使用できます。私はそれをテストする必要があります。この場合にうまくいくかどうかはわかりませんが、おそらく次のようなことができます:

# for the first alternative
it { should have_been_read }

# for the second alternative
it "marks the notification as read" do
  notification.mark_as_dissmissed
  notification.should have_been_read
end

ボーナス ポイント db の依存関係を削除するには、'create' を使用する代わりに通知を 'build' するだけです (モデルをデータベースに永続化します)。#mark_as_dismissed メソッドがデータベースを必要としない場合 (非永続的な更新を実行できる場合)、テストは引き続き機能するはずです。

build(:notification) # create(:notification) の代わりに

于 2013-08-22T18:16:55.613 に答える