【问题标题】:How do you spec out "read-only" behavior of a Model?您如何指定模型的“只读”行为?
【发布时间】:2009-02-08 14:28:59
【问题描述】:
例如,假设我有一个 Question 模型,它具有布尔字段 answered 和 closed。我将如何使用 RSpec 测试问题 should be read only when marked as answered 的行为?这似乎是模型的行为,但我不确定如何最好地测试它。我是否应该为此行为使用 before 过滤器,并添加一个错误,说明您无法修改已回答的问题?或者有更好的方法吗?我只是在学习 RSpec 和 BDD。
【问题讨论】:
标签:
ruby-on-rails
rspec
bdd
【解决方案1】:
取决于您需要它如何工作,但是...
describe Question do
it "should be read only when marked as answered" do
question = Question.new(:title => 'old title')
question.answered = true
question.save
# this
lambda {
question.title = 'new title'
}.should raise_error(ReadOnlyError)
# or
question.title = 'new title'
question.save
question.title.should == 'old title'
# or
quesiton.title = 'new title'
question.save.should be_false
end
end
或者您可能希望在保存时引发错误?或者也许没有错误,它只是默默地不改变值?实现方式由您决定,但方法是相同的。
- 将对象设置为您想要指定的状态
- 确保您的对象在该状态下符合您的预期
所以设置一个已回答的问题,然后看看您是否可以更改其中的数据。如果你不能,那么规范就通过了。这取决于您希望模型的行为如何工作。 BDD 的优点在于您首先考虑这个接口,因为您必须实际使用对象 API 才能对其进行规范。