1

我在某处读到,将方法分解为更小的、可测试的函数是一个好主意,以便可以测试更小的方法。但是我对如何测试调用较小方法的方法感到困惑。这是一个例子:

class MyTestableClass
{
    public function myHugeFunction($list, array $list_filter_params)
    {
        // do a bunch of stuff, then...
        foreach($list as $item) {
            $this->subFunction($item);
        }
    }

    public function subFunction()
    {
        // do stuff for each item
    }
}

和测试类:

class MyTestableClassTest extends PHPUnit_Framework_TestCase
{
    public function testSubFunction
    {
        // This tests the smaller, bite-size method, which is good.
    }
    public function testMyHugeFunction
    {
        // this tests the parent function *and* the subFunction. I'm trying
        // to test *just* the parent function.
    }
}

我知道如何测试 subFunction,但是由于我不能在同一个类中存根方法,所以我不知道如何测试父方法。我想找到一种以某种方式将 subFunction 存根以返回 true 的方法。

您是否使用事件并存根事件类?这是我能想到的唯一方法来存根在同一个类中调用的另一个方法。

4

1 回答 1

1

除了@fab 在他的评论中所说的(你真的应该考虑一下!),实际上你可以在 SUT 中存根/模拟方法。对于您的示例,构建您的 SUT 对象可能如下所示:

class MyTestableClassTest extends PHPUnit_Framework_TestCase
{
    public function testSubFunction
    {
        // This tests the smaller, bite-size method, which is good.
    }
    public function testMyHugeFunction
    {
        // first, prepare your arugments $list and $list_filter_params
        // (...)

        // Next build mock. The second argument means that you will mock ONLY subFunction method
        $this->sut = $this->getMock('Namespace\MyTestableClass', array('subFunction'));

        // now you can set your subFunction expectations:
        $this->sut->expects($this->exactly(count($list))
            ->with($this->anything()); // of course you can make this mock better, I'm just showing a case

        // start testing
        $this->sut->myHugeFunction($list, $list_filter_params);
    }
}

PS 再说一次,正如@fab 所说:如果你展示一个具体的案例,我相信你会从这里的人们那里得到很多好的答案。

于 2013-02-21T10:52:04.810 回答