0

我想测试我的模型类之一,所以我必须从我的数据库中插入、更新和删除数据,以测试我的方法是否正常工作。

我正在使用一个已定义的测试数据库,其中我已经有一些数据。为了测试所有方法,我使用两个角色,一个是管理员,一个是用户。所以我使用 setUp 方法获取他们的数据,如下所示:

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”这样将数据从用户表移动到被禁止用户表的方法时,我遇到了一个问题,因为下次我为测试选择的用户将无法正常运行' t 在同一张桌子上。似乎 setUP() 和 tearDown() 方法只在调用所有测试方法后执行一次。这样,如果 bannAccess 测试方法在 testGetUserName 方法之前执行,例如,最后一个将失败,因为用户不在 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']);
}

谢谢。

4

1 回答 1

1

你的整个测试设置不好。您应该为此使用固定装置,并在固定装置中显示记录。见http://book.cakephp.org/2.0/en/development/testing.html#fixtures

setUp() 和 tearDown() 只执行一次,而 startTest() 和 endTest() 用于每个 test*() 方法。

此外,您不应使用query() ,因为由于 SQL 注入,它可能不安全。如果您愿意使用 CakePHP ORM 会处理它...看到测试中出现的 query() 让我觉得您已经在应用程序中使用它并构建了一个非常不安全的应用程序。

另外,为什么您必须将用户复制到另一个表,而不是简单地用一个简单的 tinyint 字段将它们标记为禁止?

于 2012-04-10T16:00:56.567 回答