这可能是我对嘲笑的误解。我真的很感激解释为什么嘲笑一个不存在或存在的类是一件好事?
示例场景:假设我们有一个类依赖于第二类的输出,并且我们更改了输出格式或其他任何东西。尽管它们在头等舱中已经过时,但这难道不会使我们的测试保持成功吗?
这可能是我对嘲笑的误解。我真的很感激解释为什么嘲笑一个不存在或存在的类是一件好事?
示例场景:假设我们有一个类依赖于第二类的输出,并且我们更改了输出格式或其他任何东西。尽管它们在头等舱中已经过时,但这难道不会使我们的测试保持成功吗?
答案是肯定的!如果您在代码中遵守某些可测试性原则,则可以将一种方法与同一类中的其他方法隔离开来。这就是单元测试的目标。
看这个例子:
<?php
class User {
public function years()
{
return floor($this->months() / 12);
}
public function months()
{
// Database call or anything else, it's a black box !
}
}
class UserTest extends TestCase {
public function testYearsReturnTheNumberOfYears()
{
$user = \Mockery::mock('User[months]');
$user->shouldReceive('months')->andReturn(18);
assertEquals(1, $user->years());
}
}
即使方法months
被破坏,测试也会通过。阅读嘲笑文档以获得更多解释。
模拟是单元测试的关键。如果没有这个工具,当你的代码出现问题时,你的所有测试都会失败,并且你无法找到错误的根源。PHP 不够灵活,无法像 Ruby 或 Javascript 那样模拟所有内容,但通过良好的设计模式,您可以做得很好。
一个很好的例子是 Laravel,所有的核心类都可以被模拟。像这样,您可以模拟数据库调用或电子邮件发送中的错误。
我遇到了类似的问题。我不得不用依赖注入模拟相同的类方法。所以用 Mockery 部分模拟......
$mock = Mockery::mock('MyClass[methodToMock1, methodToMock2]', array('constructor parameter 1', 'constructor parameter 2'));
$mock->shouldReceive('methodToMock1')->once()->andReturn('someValue');
$mock->shouldReceive('methodToMock2')->once()->andReturn('someValue2');
$this->assertTrue($mock->methodNum3(), 'some assert');
希望这会对某人有所帮助。