2014-01-16 46 views
0
class ProductTest < ActiveSupport::TestCase 
    test "product attributes must not be empty" do 
    product = Product.new 
    assert product.invalid? 
    assert product.errors[:title].any? 
    assert product.errors[:description].any? 
    assert product.errors[:price].any? 
    assert product.errors[:image_url].any? 
    end 
end 

大家好。我對Ruby on Rails很新,我正在嘗試創建一個簡單的在線書店。我有一個需要測試的產品模型。我試圖用「英語」來理解這段代碼,但我很困惑。那麼,模型需要包含:title,:description,:price,:image_url是否正確?如何解釋此驗證測試代碼?

我們是否試圖測試產品模型中是否存在所有這些屬性?

謝謝大家。

+0

「我們是否試圖測試產品模型中是否存在所有這些屬性?」是的,如果產品沒有這些屬性,並且它應該包含由這些屬性的驗證失敗導致的錯誤消息,那麼您正在測試該產品是無效的,但是我需要'product = Product.new'後面的'product.save' – bjhaid

+0

嗨bjhaid。感謝你的快速回復。你能否澄清「product.save」部分?我想它也會測試看看保存的產品是否包含給定的屬性?謝謝。 –

+0

觸發驗證 – bjhaid

回答

1

該測試假定Product模型具有一些驗證。

測試開始上線

product = Product.new 
在那裏你創建一個新的產品

。然後,您首先觸發調用invalid?的驗證,如果實例無效並返回true,並填充errors列表。

product.invalid? 

如果參數的結果爲false,則斷言之前會使測試失敗。在這種情況下,參數是驗證的結果。

assert(product.invalid?) 

如果product.invalid?將返回false就表示該產品是有效的,這意味着驗證沒有發生,這是你期望不算什麼。

然後代碼會檢查每個預計會發生錯誤的屬性,以查看是否設置了錯誤。

product.errors包含關鍵字爲無效屬性的錯誤列表,如果該屬性有效,則該值爲數組或nil。

assert product.errors[:description].any? 

例如意味着您期望description屬性無效,並且實際上您檢查是否至少有一個錯誤集。


我個人真的不喜歡那個測試的方法,因爲它的部分不完整的(你不實際測試的實際驗證使得無法理解爲什麼特定的屬性是無效的),但它絕對是一個好一個簡單的應用程序的起點。

+0

非常感謝您提供的詳細和真棒答案Simone!我現在明白了:) –