0

予測できない値を返すクラスと、その関数を呼び出すメソッドの単体テストに問題があります。そこで、メソッドの戻り値を変更します。

インスタンスを作成できないため、そのメソッドをモックできません。次に例を示します。

// Class called MyClass
public function doSomething(){
    $foo = new Foo();
    $bar = $foo->getSomethingUnpredictable();

    // Doing something with $bar and saves the result in $foobar.
    // The result is predictable if I know what $foo is.

    return $forbar;
}

// The test class
public function testDoSomething{
    $myClass = new MyClass();
    when("Foo::getSomethingUnpredictable()")->thenReturns("Foo");

    // Foo::testDoSomething is now predictable and I am able to create a assertEquals
    $this->assertEquals("fOO", $this->doSomething());
}

単体テストで Foo::testDoSomething が返すものをチェックして結果を計算するかもしれませんが、testDoSomething と doSomething の違いはほとんどありません。また、他の値で何が起こるかを確認することもできません。
varargs が使用されているため、doSomething にはパラメーターを指定できません (そのため、最適なパラメーターを追加できません)。

4

1 に答える 1

0

これが、ハードワイヤードの依存関係が悪い理由であり、現在の状態doSomethingではテストできません。MyClass次のようにリファクタリングする必要があります。

public function setFoo(Foo $foo)
{
    $this->foo = $foo;
}
public function getFoo()
{
    if ($this->foo === null) {
        $this->foo = new Foo();
    }
    return $this->foo;
}
public function doSomething(){
    $foo = $this->getFoo();
    $bar = $foo->getSomethingUnpredictable();

    // Doing something with $bar and saves the result in $foobar.
    // The result is predictable if I know what $foo is.

    return $forbar;
}

Foo次に、モックされたインスタンスを注入できます。

$myClass->setFoo($mock);
$actualResult = $myClass->doSomething();

メソッドをスタブ化する方法については、テスト フレームワークによって異なります。この ( when("Foo::getSomethingUnpredictable()")->thenReturns("Foo");) は PHPUnit ではないためです。

于 2013-03-20T16:00:05.663 に答える