【发布时间】:2015-08-15 00:14:53
【问题描述】:
我需要测试一下,代码会创建一个具有某些参数的类的新实例:
$bar = new ProgressBar($output, $size);
我尝试创建一个别名模拟并为__construct 方法设置一个期望,但它不起作用:
$progressBar = \Mockery::mock('alias:' . ProgressBar::class);
$progressBar->shouldReceive('__construct')
->with(\Mockery::type(OutputInterface::class), 3)
->once();
这个期望永远不会满足:
嘲弄\异常\无效计数异常:方法 __construct(object(Mockery\Matcher\Type), 3) 来自 Symfony\Component\Console\Helper\ProgressBar 应该被准确地调用 1 次,但调用了 0 次。
您知道如何使用 Mockery 进行测试吗?
【问题讨论】:
-
你的构造函数是否包含业务逻辑?如果是这样,那么它可能不应该,因为构造函数只应该真正关心将对象初始化为有效的初始状态。这通常只是将参数分配给成员变量,这很简单,不需要测试。
-
我不太确定是否正确理解了您的问题。你想创建一个 Mock 但不知道如何传递构造函数参数?还是您真的要检查是否调用了构造函数方法?因为那将是非常非常糟糕的做法 - 这不是它的工作原理。或者您正在测试一种创建 ProgressBar 对象的方法?然后你应该重构它,以便将 PrograssBar 对象作为参数传递给该方法或作为包含该方法的类的构造函数参数(依赖注入)。
-
我正在为 Symfony 控制台编写一个简单的命令。我想测试在执行命令期间是否初始化了具有正确单位数的 ProgressBar。
-
@VaclavSir 好的,这不太可能,例如php单元。有一种叫做“方面模拟”的东西允许这样的场景,但仅仅因为你可以并不意味着你应该。正如我上面提到的,请阅读“依赖注入”。执行此操作的 OOP 方法是将 PrograssBar 对象传递给方法,而不是在方法中创建它。
-
不,不会,DI 方式是注入工厂。然而,直接实例化 ProgressBar 是一种常见的做法,工厂除了
return new ProgressBar(...func_get_args())不会做任何事情。所以我想知道这种做法是否可以用 Mockery 来测试。我会看看 AspectMock。
标签: php unit-testing mockery