2014-07-20 177 views
2

我是使用rspec的新手。我正在試圖找出正確的測試命令。Rspec測試條件

describe Person do 
    let(:person) do 
    Person.new({ 
     first_name: "", 
     last_name: "", 
     birthdate: 30.years.ago, 
     gender:  "" 
    }) 
    end 

    it "is creates a new Person" do 
    create(:person).should be_valid 
    end 

    it "has a full name" do 
    person {Person.new(first_name: "", last_name: "")} 
    person.should_not be_valid 
    end 

我得到以下錯誤: 人是創建FIXED一個新的人。 預期等待'請測試我'失敗。沒有錯誤發生

回答

0

對於create類方法,你不應該傳遞一個Person實例,你應該只傳遞屬性的散列。

describe Person do 
    let(:person_attributes) do 
    { first_name: "", last_name: "", birthdate: 30.years.ago, gender: "" } 
    end 

    it "is creates a new Person" do 
    create(:person_attributes).should be_valid 
    end 
    ... 

在第二個例子,如果你不使用let你應該做直轉讓

it "has a full name" do 
    person = Person.new(first_name: "", last_name: "") 
    person.should_not be_valid 
    end 
1

在你的第一個例子,你居然要檢查,如果你能保存記錄,這你之前已經實例化了。那麼,爲什麼不簡單地打電話save!,並期望你的代碼不會返回任何錯誤?當您要保存記錄時,您不能始終依靠valid?。 我的方法看起來就像

expect{ person.save! }.to_not raise_error(ActiveRecord::RecordInvalid) 

注:save!會產生一個錯誤,而save只返回false

你的第二個例子是類似的不精確,因爲你剛纔問你是否記錄試圖分配後是否有效兩個屬性。如果它說「不,它是無效的。」你的測試會通過,但它可能會傳遞錯誤的原因。如果你打電話valid? ActiveRecord會添加錯誤記錄,如果有的話。那麼你爲什麼不在這裏要求具體的錯誤呢?

person.valid? 
expect{ person.errors }.to include("first_name and last_name can't be blank") 

這樣一來,你真的一定要引起預期的行爲,如果你有其他非故意的錯誤測試將無法通過。