2

何か間違ったことをしているのか、それともPHPUnitとモックオブジェクトのバグなのかわかりません。基本的に、トリガー$Model->doSomething()されたときにが呼び出されるかどうかをテストしようとしています。$Model->start()

私はVirtualBoxでUbuntuを使用しており、phpunit1.1.1はpear経由でインストールされています。

完全なコードは以下のとおりです。どんな助けもいただければ幸いです、それは私を夢中にさせています。

<?php
require_once 'PHPUnit/Autoload.php';

class Model
{
    function doSomething( ) {
        echo 'Hello World';
    }

    function doNothing( ) { }

    function start( ) {
        $this->doNothing();
        $this->doSomething();
    }
}

class ModelTest extends PHPUnit_Framework_TestCase
{
    function testDoSomething( )
    {
        $Model = $this->getMock('Model');
        $Model->expects($this->once())->method('start'); # This works
        $Model->expects($this->once())->method('doSomething'); # This does not work
        $Model->start();
    }
}
?>

PHPUnitからの出力:

There was 1 failure:

1) ModelTest::testDoSomething
Expectation failed for method name is equal to <string:doSomething> when invoked 1 time(s).
Method was expected to be called 1 times, actually called 0 times.


FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
4

2 に答える 2

3

ご覧のとおり、モックするメソッドをPHPUnitに指示する必要があります。また、テストから直接呼び出しているメソッドに対する期待を作成することは避けます。上記のテストは次のように記述します。

function testDoSomething( )
{
    $Model = $this->getMock('Model', array('doSomething');
    $Model->expects($this->once())->method('doSomething');
    $Model->start();
}
于 2012-08-26T20:26:33.153 に答える
0

David Harknessの答えが機能する理由を拡張するために、$ methodsパラメーターを指定しないgetMockと、クラス内のすべての関数がモックされます。ちなみに、これは次のように確認できます。

class ModelTest extends PHPUnit_Framework_TestCase
{
    function testDoSomething( )
    {
        $obj = $this->getMock('Model');
        echo new ReflectionClass(get_class($obj));
        ...
    }
}

それで、なぜそれは失敗するのですか?あなたのstart()関数も嘲笑されているからです!つまり、指定した関数本体が置き換えられたため、$this->doSomething();行が実行されることはありません。

したがって、保存する必要のある関数がクラスにある場合は、他のすべての関数のリストを明示的に指定する必要があります。

于 2012-08-27T23:48:24.860 に答える