Ruby on rails 您是如何指定的;只读;模型的行为?

Ruby on rails 您是如何指定的;只读;模型的行为?,ruby-on-rails,rspec,bdd,Ruby On Rails,Rspec,Bdd,例如,假设我有一个问题模型,其中布尔字段已回答和已关闭。我如何使用RSpec测试问题标记为已回答时应为只读的行为?这似乎是模型的行为,但我不确定如何最好地测试它。我是否应该对此行为使用before筛选器,并添加一个错误,说明您无法修改已回答的问题?还是有更好的方法?我只学习RSpec和BDD。取决于您需要它如何工作,但是 describe Question do it "should be read only when marked as answered" do question

例如,假设我有一个
问题
模型,其中布尔字段
已回答
已关闭
。我如何使用RSpec测试问题
标记为已回答时应为只读的行为?这似乎是模型的行为,但我不确定如何最好地测试它。我是否应该对此行为使用before筛选器,并添加一个错误,说明您无法修改已回答的问题?还是有更好的方法?我只学习RSpec和BDD。

取决于您需要它如何工作,但是

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最棒的一点是,您首先考虑这个接口,因为您必须实际使用一个ObjectsAPI来规范它