差异存根夹具
Difference Stub Fixture
我正在学习代码接收,我想知道存根和固定装置之间有什么区别。
两者都帮助我加载定义明确的数据并使测试变得简单。
但是我什么时候用
\Codeception\Util\Stub 我什么时候使用
\Codeception\Util\Fixtures
所以存根是 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 class。我们使用了 Codeception 存根并假装 BalanceRepository class 存在。通过假装它存在,我们可以通过检查是否抛出 NegativeBalanceException 来测试 UpdateBalance::subtract 函数的功能。
另一方面,fixtures 将用于在所有测试中共享测试数据。如果我们再次使用 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);
}
}
现在我们可以在所有测试中使用我们的 pre-defined 固定装置。我想指出的是,在上面的例子中使用固定装置可能有点矫枉过正,但是对于更复杂的测试数据,比如检查十六进制值是否有效,那么它会更有用。
我正在学习代码接收,我想知道存根和固定装置之间有什么区别。 两者都帮助我加载定义明确的数据并使测试变得简单。
但是我什么时候用 \Codeception\Util\Stub 我什么时候使用 \Codeception\Util\Fixtures
所以存根是 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 class。我们使用了 Codeception 存根并假装 BalanceRepository class 存在。通过假装它存在,我们可以通过检查是否抛出 NegativeBalanceException 来测试 UpdateBalance::subtract 函数的功能。
另一方面,fixtures 将用于在所有测试中共享测试数据。如果我们再次使用 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);
}
}
现在我们可以在所有测试中使用我们的 pre-defined 固定装置。我想指出的是,在上面的例子中使用固定装置可能有点矫枉过正,但是对于更复杂的测试数据,比如检查十六进制值是否有效,那么它会更有用。