数据库测试我想测试我的模型类之一,所以我必须插入,更新和以测试从我的数据库中删除的数据,如果我的方法工作。使用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