如何使用新的rspec语法测试模型方法?

时间:2013-08-22 18:06:13

标签: ruby-on-rails rspec

在下面的规范中,我想测试一个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

1 个答案:

答案 0 :(得分: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依赖项,您只需“构建”通知,而不是使用“create”(将模型保留在数据库中)。如果#mark_as_dismissed方法不需要db(可以执行非持久更新),那么测试仍然可以正常工作。

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