天天看點

Rails測試《一》fixtures簡介

簡介

每個rails應用都包括三個環境:

生産環境

開發環境

測試環境

我們的測試就是跑在測試環境,如果測試涉及資料庫,會在測試資料庫進行操作。這樣不會對生産環境和開發環境的資料造成影響。

我們先使用

rails new projects 

指令來建立一個rails應用,預設會給我們建立一個projects目錄,裡面會包含一些預設的目錄和檔案。其中有一個檔案夾test,裡面将會放我們全部的測試相關檔案。

$ ls -F test/ 

fixtures/       functional/     integration/   performance/  test_helper.rb  unit/ 

fixtures檔案夾

fixtures檔案夾中的檔案都是用yml為字尾,檔案的格式都是yaml。

這裡面的檔案用來做什麼呢?用來建立資料,建立測試用的資料。每個檔案對應一張資料庫表,檔案的名稱就是資料庫表的名稱,裡面可以建立很多的資料,每一個資料對應表的一行資料。

檔案中一般會寫上每個字段的值,即使表的主鍵id是自增字段,也是可以指定的,如果不指定,系統會自動的配置設定。

users表結構

create_table :users do |t| 

  t.string name 

  t.datetime birthday 

  t.string profession 

  t.timestamps 

end 

users.yml

david: 

id: 1

  name: David Heinemeier Hansson 

  birthday: 1979-10-15 

  profession: Systems development 

user.rb

class User < ActiveRecord::Base 

  attr_accessible :name, :birthday, :profession 

end 

可以在單元測試和功能測試中使用這些資料,相當于是一些模拟資料。

這些yml檔案如何使用呢?

在你進行單元unit測試和功能functional測試的時候,會自動加載fixtures檔案夾中的yml檔案,然後進行下面的三步:

删除測試資料庫中已經存在的資料。

将fixtures中的資料加載到測試資料庫表中。

然後将fixtures的資料放到一些變量中,在後面的測試就可以直接從變量通路這些資料。

寫yml檔案的時候有幾個點需要注意。

首先,yml檔案中模拟資料的屬性對應的是資料表的字段,yml檔案中的屬性個數可以比資料表的字段個數少,但是不能多于資料表的字段個數,或者模拟一些資料庫不存在的字段。

為什麼?

因為會根據yml檔案中模拟的屬性生成insert語句的field,然後資料會插入測試資料庫。如果發現資料庫沒有的字段,就會插入失敗,很顯然,因為insert中包含了資料庫表沒有的字段。但是你少幾個沒有關系,但是如果資料庫有限制的話,那還是有可能有問題。例如:非空字段,你沒有模拟,那就報錯了。

其次,有時候我們還是會碰到這樣一種情況。我們需要一些實體,而且需要這些實體具有一些屬性,但是這些屬性在資料庫中沒有對應的存儲。

例如我們常用的使用者實體,我們會有兩個屬性password和password_confirmation,用來注冊的時候進行密碼的驗證,但是最終存入表格的密碼是hash以後的值,不是使用者在界面上出入的值。

class User < ActiveRecord::Base 

  attr_accessible :email, :name, :password, :password_confirmation 

  validates :password, :confirmation => true 

  validates :password, :presence => true 

end 

如果你想測試針對密碼的validates是否生效,這時候password和password_firmation這兩個字段就不能在yml檔案中模拟,因為資料庫中沒有這兩個字段。如果在模拟檔案中包含這兩個字段,會報錯的,因為前面說過了,模拟資料會先插入測試資料庫,不存在的字段會造成插入失敗,測試就失敗了。

這樣的實體,在測試資料庫不存在的字段的時候,如果需要模拟一些這樣的實體,就不能再yml檔案中模拟了,隻能通過代碼來模拟這樣的實體。然後再進行其他測試。

user = User.new(:password => "123", :password_confirmation => "123") 

通路fixtures中的資料。

users(:divid) 

通過users(:divid)就可以通路到users.yml中模拟的divid的資料。通過users(:divid).name就可以通路模拟的name屬性值。

總結

fixtures就是用來建立模拟資料的。

這些資料會被插入測試資料庫,是以不能模拟資料庫不存在的屬性。

模拟資料可以在單元測試unit test和功能測試functional test中使用,通過表名(:模拟實體名)就可以通路模拟實體。users(:devid)就是一個user,然後users(:devid).name就可以通路name屬性的值。

本文轉自 virusswb 51CTO部落格,原文連結:http://blog.51cto.com/virusswb/1075385,如需轉載請自行聯系原作者