你如何规范模型的“只读”行为?

时间:2009-02-08 14:29:00

标签: ruby-on-rails rspec bdd

例如,假设我有一个Question模型,它具有布尔字段answeredclosed。我如何使用RSpec测试问题should be read only when marked as answered的行为?这似乎是模型的行为,但我不确定如何最好地测试它。我是否应该使用前置过滤器来解决此问题,并添加错误,说明您无法修改已回答的问题?或者有更好的方法吗?我只学习RSpec和BDD。

1 个答案:

答案 0 :(得分:2)

取决于你需要它的工作方式,但是......

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

或许您希望在保存时引发错误?或者也许没有错误,它只是默默地不改变价值?这取决于你想要如何实现它,但方法是相同的。

  1. 以您想要指定的状态设置对象
  2. 确保您处于该状态的对象符合您的期望
  3. 然后设置一个已回答的问题,然后查看是否可以更改其数据。如果你不能,那么规范就通过了。这取决于您希望模型的行为如何工作。关于BDD的好处是你首先考虑这个接口,因为你必须实际使用一个对象API才能指出它。