0

私は phpUnit を使用し、拡張してデータベースに関連するテストを作成しますPHPUnit_Extensions_Database_TestCase。データベース障害をシミュレートしてエラー チェックをテストするにはどうすればよいですか? データベースがダウンしている以外に、どのような障害が発生する可能性がありますか?

この Ruby on Rails の質問を見つけましたが、phpUnit とは関係がないことがわかりました。

4

1 に答える 1

4

コード ブロックを分離し、PHPUnit で Mocks/Stubs を使用してデータベース呼び出しからの戻りを制御し、エラーを含めます。これにより、メイン コードがエラーを処理します。実際のデータベースは使用しませんが、例外またはコードが期待する方法でデータベース エラーを処理するための対話を行うコードをテストします。

コードからの同じリターンをモックでシミュレートするには、次のようにします。

$stub = $this->getMock('YourDBClass');

// Configure the stub to return an error when the RunQuery method is called
$stub->expects($this->any())
     ->method('RunQuery')
     ->will($this->throwException(new SpecificException));

@expectsExceptionのいずれかを使用してテストできます

/**
 * @expectedException SpecificException
 */
public function testDBError()
{
    $stub = $this->getMock('YourDBClass');

    // Configure the stub to return an error when the RunQuery method is called
    $stub->expects($this->any())
         ->method('RunQuery')
         ->will($this->throwException(new SpecificException));

    $stub->RunQuery();  
}

または setExpectedException を使用して

public function testDBError()
{
    $stub = $this->getMock('YourDBClass');

    // Configure the stub to return an error when the RunQuery method is called
    $stub->expects($this->any())
         ->method('RunQuery')
         ->will($this->throwException(new SpecificException));

    $this->setExpectedException('SpecificException');
    $stub->RunQuery();  
}

次に、既知のリターンを同じ方法でテストします

public function testDBQueryReturns1()
{
    $stub = $this->getMock('YourDBClass');

    // Configure the stub to return an error when the RunQuery method is called
    $stub->expects($this->any())
         ->method('RunQuery')
         ->will($this->returnValue(1));

    $this->assertEquals(1, $stub->RunQuery(), 'Testing for the proper return value');
}
于 2013-10-02T15:17:11.523 に答える