2012-04-06 72 views
0

我有一個看起來像這樣的請求規格:更好的方式來編寫這個請求規範?

describe "Registering from the main page" do 
    before(:each) do 
    fill_in "username","my_username" 
    fill_in "password","my_password" 
    fill_in "password_confirmation","my_password" 
    click_button "Register" 
    end 

    it "should have created a new user" do 
    User.count.should == 1 
    end 

    it "should have changed the message on the homepage" do 
    find("#element").value.should == "You registered!" 
    end 

    # ... other tests like this 
end 

第一個問題,我怎麼能保證我有0用戶提交表單之前?

其次,before對我來說看起來不太合適,即使它能完成這項工作。是否有另一種方式來編寫整個註冊用例的測試?或許以某種方式重新構思前一部分,還是以我的方式接受?

更新:我將before(:all)更改爲before(:each),因爲測試開始失敗。當我使用before(:all)時,響應的主體似乎不完整。你碰巧知道爲什麼?

回答

1

您可以可以使用change()匹配,以免擔心伯爵就是事先:

lambda { click_button("Register") }.should change{ User.count }.by(1) 

如果你真的希望它專門去從0到1,你可以這樣做:

lambda { click_button("Register") }.should change{ User.count }.from(0).to(1) 

要回答這個問題有關before(:all)before(:each)before(:each)將獲得每個示例(it塊)之前調用一次,而before(:all)describe塊的所有示例之前僅被稱爲一次。這就是爲什麼before(:all)通常不被推薦的原因,因爲如果你的任何例子改變了初始狀態,後面的例子將會受到影響。

+0

怎麼樣的事實,這是一個'前(:每個)'塊?有沒有辦法讓它離開那裏? – Geo 2012-04-06 12:00:14

+0

除了'click_button'這一行註冊「',我認爲代碼是在正確的地方。它是測試註冊的準備,看起來它需要在所有示例中都存在,所以'before(:each)'很好。 – tsherif 2012-04-06 12:06:08

+0

另外,增加了一些東西來解決'before(:all)'/​​'before(:each)'問題。 – tsherif 2012-04-06 12:16:03

相關問題