モデルクラスの1つをテストしたいので、メソッドが正常に機能するかどうかをテストするために、データベースからデータを挿入、更新、および削除する必要があります。
すでにいくつかのデータがある定義済みのテストデータベースを使用しています。すべての方法をテストするには、管理者とユーザーの2つの役割を使用します。したがって、次のような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'];
}
ユーザーテーブルからbannedUsersテーブルにデータを移動する「banAccess」のようなメソッドをテストしたい場合、次にテスト用に選択したユーザーがテストを実行しないため、テストがうまく実行されないため、問題が発生します。同じテーブルにいる必要があります。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']);
}
ありがとう。