2012-04-10 64 views
0

數據庫測試我想測試我的模型類之一,所以我必須插入,更新和以測試從我的數據庫中刪除的數據,如果我的方法工作。使用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']); 
} 

感謝。

回答

1

你的整個測試設置不好。你應該使用燈具來記錄燈具中的記錄。請參閱http://book.cakephp.org/2.0/en/development/testing.html#fixtures

setUp()和tearDown()僅執行一次,而startTest()和endTest()則用於每個測試*()方法。

而且你應該使用查詢(),因爲它是因爲SQL注入的潛在不安全因素。 CakePHP ORM會照顧到這一點,如果你會使用它...要看到測試中存在的查詢()讓我覺得你已經在應用程序中使用它並構建了一個非常不安全的應用程序。

而且你爲什麼要用戶複製到另一臺,而不是簡單地標記他們作爲一個簡單的TINYINT場被取締?

+0

你確定,問:Burzum?我曾經爲cake2寫過一個測試腳本,告訴我setUp和tearDown在每個starTest/endTest之前和之後運行,因此也在每個測試*方法之前和之後運行。 – mark 2012-04-10 16:08:05

+0

是的,我在我的所有模型中使用$ this-> query。那我還能用什麼? 關於夾具的東西,似乎有點無聊,再次寫所有的數據,而不是從數據庫中獲取它... 因此,對於我現在正在做的,我應該使用startTest和endTest? 和好了,我爲他們移動到另一個表,因爲他們有其他的領域,如「理性」,「EXPIREDATE」。我認爲這是一個更好的數據庫設計,如果我不想在其他未禁用的用戶中使用NULL這兩個字段。 – Alvaro 2012-04-10 16:17:05

+0

@mark我檢查了之前檢查的API,因爲我永遠不會記得所有的方法。但是今天晚些時候我會檢查代碼。史蒂夫我不同意數據庫設計,加上你最終會得到兩個非常相似的模型,很可能重複代碼。除了query()還有什麼?您是否閱讀過框架的內容? http://book.cakephp.org/2.0/en/models.html從這裏開始閱讀。你應該使用Model :: find()來處理所有事情,如果你從mysql切換到oracle(如果使用正確的話),它會照顧正確的轉義,你的代碼仍然可以工作。 – burzum 2012-04-10 16:42:34