1

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

4

1 回答 1

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. 确保你的对象在那个状态下做你所期望的

所以设置一个已回答的问题,然后看看你是否可以更改它的数据。如果你不能,那么规范通过了。这取决于您希望模型的行为如何工作。BDD 的伟大之处在于您首先考虑这个接口,因为您必须实际使用对象 API 才能对其进行规范。

于 2009-02-09T06:51:49.397 回答