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 的区别很小。我也无法检查其他值会发生什么。
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 回答