1

短い質問: SimpleTest で Mock オブジェクトをリセットして、すべての期待を取り除く方法はありますか?

より長い説明:

SimpleTestを使用してテストしているクラスがあり、使用しているモック オブジェクトに問題があります。

クラスは でLogger、ロガー内には多数のWriterオブジェクト ( FileWriterEmailWriterなど) があります。メソッドを呼び出すと、Logger::log()バックグラウンドでいくつかのロジックが実行され、メッセージが正しいライターにルーティングされます。ライターは Logger クラスにキャッシュされ、毎回再インスタンス化する必要がありません。

私の単体テストでは、Logger をセットアップし、いくつかの Mock Writer オブジェクトを作成してそれに追加MockDBWriter->expectOnce()し、Logger が機能していることをテストするなどの方法を使用しています。

ここでの問題は、Logger の別の機能をテストしたいということですが、expectOnce期待はまだ有効であり、後続のテストが失敗する原因となっています。

function testWritesMessageOK() {
    $log = Logger::getInstance();
    $mock = new MockFileWriter($this);

    $log->addWriter($mock);

    $mock->expectOnce("write", "Message");

    $log->write("Message");    // OK
}

// this is just an example - the actual test is much less inane
function testNumberOfWrites() {
    $log = Logger::getInstance();
    $mock = $log->getWriter();

    $mock->expectCallCount('write', 2);

    $log->write("One");    // fail - it doesn't match "Message"
    $log->write("Two");
}

モックオブジェクトをリセットして、すべての期待を取り除く方法はありますか?

4

1 に答える 1

2

個別のモック インスタンスを使用します。

また:

$mock = $log->getWriter();
$mock = new $mock;

または:

$mock = new MockFileWriter($this);
// And then:
$mock = new MockDBWriter($this);
// And then:
$mock = new MockEmailWriter($this);
// etc.

再インスタンス化を防ぐためにライターをキャッシュすることの賢明さに疑問を呈します。インスタンス化を安価な操作 (つまり、DB 接続などを作成しない) にし、最初のクエリなど、実際に接続が必要になるまでそのようなことを延期すると、キャッシュする必要がなくなり、この問題全体が発生する可能性がありますどこかに行って。

他にできることは、SimpleMock コンストラクターを呼び出すことです。

$mock = $log->getWriter();
$mock->SimpleMock();

これはすべてこれを行います:

/**
 *    Creates an empty action list and expectation list.
 *    All call counts are set to zero.
 *    @access public
 */
function SimpleMock() {
    $this->_actions = &new SimpleCallSchedule();
    $this->_expectations = &new SimpleCallSchedule();
    $this->_call_counts = array();
    $this->_expected_counts = array();
    $this->_max_counts = array();
    $this->_expected_args = array();
    $this->_expected_args_at = array();
    $test = &$this->_getCurrentTestCase();
    $test->tell($this);
}

それに関する唯一の問題は、期待値を集計するときに が 2 回呼び出されるtell()原因となる最後の呼び出しです。SimpleMock::atTestEnd()しかし、これでそれを修正できます:

// $this should == the test case in question
array_pop($this->_observers);

この回答は、SimpleTest のバージョン 1.0.1 に基づいています。

于 2009-10-26T10:31:11.040 に答える