2009-02-08 33 views
1

例如,假設我有一個Question模型,該模型具有布爾字段answeredclosed。我如何測試使用RSpec的問題should be read only when marked as answered的行爲?這似乎是模型的行爲,但我不確定如何最好地測試它。我是否應該在此行爲之前使用過濾器,並且添加一個錯誤,指出您無法修改已回答的問題?還是有更好的方法來做到這一點?我只學習RSpec和BDD。如何指定模型的「只讀」行爲?

回答

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來指定它。