0

在下面的规范中,我想测试一个Notification实例,运行破坏性方法#mark_as_dismissed会将has_been_read列更改为 true。在保持测试简洁明了的同时如何做到这一点?

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

语法糖: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 依赖项,您可以只“构建”通知而不是使用“创建”(将模型保留在数据库中)。如果#mark_as_dismissed 方法不需要数据库(可以进行非持久更新),那么测试应该仍然有效。

build(:notification) # 而不是 create(:notification)

于 2013-08-22T18:16:55.613 回答