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