2012-04-10 65 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