數據庫測試我想測試我的模型類之一,所以我必須插入,更新和以測試從我的數據庫中刪除的數據,如果我的方法工作。使用CakePHP 2.0
我有一個定義的測試數據庫,在那裏我已經有些數據的工作。 要測試所有方法我使用兩個角色,管理員和用戶之一。所以我得到使用設置方法的數據是這樣的:
public function setUp() {
parent::setUp();
$this->User = ClassRegistry::init('User');
$admin = $this->User->query("select * from users where admin = 1");
$this->testUser['admin']['id'] = $admin[0]['users']['id'];
$this->testUser['admin']['username'] = $admin[0]['users']['username'];
$this->testUser['admin']['password'] = $admin[0]['users']['password'];
$this->testUser['admin']['verified'] = $admin[0]['users']['verified'];
$this->testUser['admin']['created'] = $admin[0]['users']['created'];
$this->testUser['admin']['nick'] = $admin[0]['users']['nick'];
$this->testUser['admin']['admin'] = $admin[0]['users']['admin'];
$user = $this->User->query("select * from users where admin = 0 and verified = 0");
$this->testUser['user']['id'] = $user[0]['users']['id'];
$this->testUser['user']['username'] = $user[0]['users']['username'];
$this->testUser['user']['password'] = $user[0]['users']['password'];
$this->testUser['user']['verified'] = $user[0]['users']['verified'];
$this->testUser['user']['created'] = $user[0]['users']['created'];
$this->testUser['user']['nick'] = $user[0]['users']['nick'];
$this->testUser['user']['admin'] = $user[0]['users']['admin'];
}
當我想測試像「banAccess」一個誰從用戶表中移動數據到bannedUsers表方法,那麼我有,因爲一個問題下次測試將無法正常運行,因爲我爲測試選擇的用戶不會在同一個表中。 似乎setUP()和tearDown()方法只在所有測試方法被調用後才執行一次。 這樣,如果在testGetUserName方法之前執行bannAccess測試方法,例如,最後一個將因用戶不在Users表上而失敗。
目前我正在測試的方法和刪除用戶後,爲了解決這個問題,但我相信它一定是一個更好的方式來做到這一點:
public function testBanAccess() {
$result = $this->User->banAccess($this->testUser['user']['id'], 'spam', '42');
$expected = true;
$this->assertEquals($expected, $result);
$this->User->query("delete from banUsers where id = ".$this->testUser['user']['id']);
}
感謝。
你確定,問:Burzum?我曾經爲cake2寫過一個測試腳本,告訴我setUp和tearDown在每個starTest/endTest之前和之後運行,因此也在每個測試*方法之前和之後運行。 – mark 2012-04-10 16:08:05
是的,我在我的所有模型中使用$ this-> query。那我還能用什麼? 關於夾具的東西,似乎有點無聊,再次寫所有的數據,而不是從數據庫中獲取它... 因此,對於我現在正在做的,我應該使用startTest和endTest? 和好了,我爲他們移動到另一個表,因爲他們有其他的領域,如「理性」,「EXPIREDATE」。我認爲這是一個更好的數據庫設計,如果我不想在其他未禁用的用戶中使用NULL這兩個字段。 – Alvaro 2012-04-10 16:17:05
@mark我檢查了之前檢查的API,因爲我永遠不會記得所有的方法。但是今天晚些時候我會檢查代碼。史蒂夫我不同意數據庫設計,加上你最終會得到兩個非常相似的模型,很可能重複代碼。除了query()還有什麼?您是否閱讀過框架的內容? http://book.cakephp.org/2.0/en/models.html從這裏開始閱讀。你應該使用Model :: find()來處理所有事情,如果你從mysql切換到oracle(如果使用正確的話),它會照顧正確的轉義,你的代碼仍然可以工作。 – burzum 2012-04-10 16:42:34