差异存根夹具

时间:2017-01-27 17:29:23

标签: codeception stub fixture

我正在学习代码,我想知道存根和固定装置之间的区别。 两者都帮助我简单地加载明确定义的数据和kepp测试。

但我什么时候使用 \ Codeception \ Util \ Stub以及何时使用 \ Codeception \的Util \赛程

1 个答案:

答案 0 :(得分:2)

所以存根是Codeception用来模拟对象的。简而言之,模拟是创建模拟真实对象行为的对象。

以下是一个例子:

class UpdateBalance
{
    public $balanceRepository;

    public function __construct(BalanceRepositoryInterface $balanceRepository)
    {
        $this->balanceRepository = $balanceRepository; 
    }

    public function subtract($amount, $id)
    {
        $updatedAmount = $this->balanceRepository->subtract($amount, $id);

        if ($updatedAmount < 0) {
            throw NegativeBalanceException($updatedAmount, $id);
        }

        return $updatedAmount;

    }
}


class UpateBalanceTest extends PHPUnit_Framework_TestCase
{
    public function testSubtractThrowsNegativeBalanceException()
    {

        $balanceRepository = Stub::make(
           'BalanceRepositoryInterface'
            array(
                'subtract' => Stub::atLeastOnce(function() { return -100 })
            )
        );


        $updateBalance = new UpdateBalance($balanceRepository);

        $this->expectException(NegativeBalanceException::class);

        $updateBalance->subtract(100, 1);


    }
}

请注意,我们没有BalanceRepsository类。我们使用了Codeception存根,假装存在BalanceRepository类。通过假装存在,我们可以通过检查是否抛出NegativeBalanceException来测试UpdateBalance :: subtract函数的功能。

另一方面,灯具用于在所有测试中共享测试数据。如果我们再次使用UpdateBalance :: subtract()示例,我们可以对数量字段进行压力测试,确保它根据传递的数量抛出正确的异常:

// In some bootstrap or setup function
Fixtures::add('zero-amount', 0);
Fixtures::add('negative-amount', -1);
Fixtures::add('string-negative-amount', '-1');




class UpdateBalance
{
    // ...

    public function subtract($amount, $id)
    {
        if ($amount < 0) {
            throw new 
        }

        // ...

    }
}


class UpateBalanceTest extends PHPUnit_Framework_TestCase
{

    // ...

    public function testSubtractThrowsCantSubtractNegativeAmountException()
    {

        $balanceRepository = Stub::make(
           'BalanceRepositoryInterface'
        );


        $updateBalance = new UpdateBalance($balanceRepository);

        $this->expectException(CantSubtractNegativeAmountException::class);

        $updateBalance->subtract(Fixture::get('negative-amount'), 1);


    }
}

现在我们可以在所有测试中使用预定义的灯具。我想指出在上面的例子中使用fixture可能会有点过分,但对于更复杂的测试数据,比如检查十六进制值是否有效,那么它会更有用。