2012-01-17 54 views
2

配置/ test.php的Yii的單元測試固定裝置在測試中不可訪問

'components'=>array(
    'fixture'=>array(
     'class'=>'system.test.CDbFxtureManager' 
    ), 
), 

測試/單元/ EntityTest.php(延伸CDbTestCase)

public $fixtures = array('entities'=>'Entity'), 

測試/裝置/ Entity.php

現在
return array(
    'entity1'=>array('slug'=>'slug1', 'title'=>'title1'), 
    'entity2'=>array('slug'=>'slug2', 'title'=>'title2'), 
); 

,在EntityTest類我試圖讓我的實體

$entities = $this->entities; 
$entity = $this->entities('entity1'); 

對於類「EntityTest」,輸出是「未知屬性」實體「。測試類是「實體」,在數據庫表名是「tbl_entity」的「CDbConnection」組件設置爲「tbl_」 tablePrefix'選項

+0

在訪問'$ this-> entities'之前,先把'var_dump($ this);'看看它有什麼屬性。另外,你期望它持有什麼樣的價值?它看起來像你試圖把它作爲一個函數在下面的行而不是作爲一個屬性訪問它。也許只是刪除'$ entities = $ this-> entities''行。 – 2012-01-17 23:31:04

+0

您有錯誤打印:「CDbFxtureManager」=>「CDbFixtureManager」 – Oleg 2012-01-18 06:54:11

+0

嘗試其替代語法,'$ entity = $ this-> entities ['entity1'];' – Elvan 2012-02-11 10:20:57

回答

5

走吧necroposting! :)

你的問題是在夾具文件的命名。您提到這是一個tests/fixtures/Entity.php,它應該在您的型號類別的名稱後面,但實際上,fixtures文件夾中的文件應該以您的型號的tableName命名。我相信Entity型號的真實表名是entity(全部用小寫),所以只需重命名文件即可。我有幾次類似的問題,並在文檔中明確指出解決方案:"A fixture is represented as a PHP script whose name (without suffix) is the same as the table name (if schema name is needed, it should be prefixed to the table name)."

+0

傳說,你知不知道我需要這10個小時? – 2013-04-13 14:59:25

+0

我還是不明白。如果我有一個名爲Entity的模型,它涉及到一個名爲Entity的表,該怎麼行'$ public $ fixtures = array( 'Entity'=>'entities' );'看起來像什麼?在這種特殊情況下,當我使用這一行時,出現'Class'實體沒有找到'的錯誤。 – physicalattraction 2015-06-24 07:42:49

+1

@physicalattraction fixtures的定義是將測試用例類的虛擬屬性映射到實體類的名稱。因此在OP的代碼示例中'$ fixtures = ['entities'=>'Entity']'。通過這種設置,測試用例將具有屬性「實體」,它將映射到預定義的「實體」類模型集。你的代碼是錯誤的,因爲它將'Entity'屬性名稱映射到'entities',它不是系統中任何類的名稱。 PHP完全告訴你這一點。 – hijarian 2015-06-24 20:05:23

1
$entity = $this->entities['entity1']; // returns an array 
$entity = $this->entities('entity1'); // returns an active record 
+0

雖然沒有涉及到的問題,我的問題也包含在本 – 2014-04-04 17:06:45

0

看看這個解決方案Yii Fixtures Issue?我也想出了同樣的問題。我忽略擴展類,確保擴展CDbTestCase。

2

也試試this if you are using setUp() method。只要調用parent :: setUp(),當你用你自己的方法重新定義它時。

+0

謝謝!這是我根據@hijarian的回答修復文件名後的第二個問題。 – 2014-06-20 17:26:55