0

モデルクラスの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']);
}

ありがとう。

4

1 に答える 1

1

テストのセットアップ全体が適切ではありません。フィクスチャにレコードが存在するようにフィクスチャを使用する必要があります。http://book.cakephp.org/2.0/en/development/testing.html#fixturesを参照してください

setUp()とtearDown()は1回だけ実行されますが、startTest()とendTest()は各test *()メソッドに対して実行されます。

さらに、SQLインジェクションのために安全でない可能性があるため、query()を使用しないでください。CakePHP ORMは、それを使用する場合にそれを処理します...テストにquery()が存在することを確認するには、それをアプリで使用して、かなり危険なアプリを作成したと思います。

また、単純なtinyintフィールドでユーザーに禁止のフラグを立てる代わりに、ユーザーを別のテーブルにコピーする必要があるのはなぜですか?

于 2012-04-10T16:00:56.567 に答える