【发布时间】:2016-09-06 17:09:40
【问题描述】:
我正在尝试使用 Mockery 来全面测试 Laravel 5.1 代码库的一些功能。
我没有在 Mockery 中进行大量的单元测试,当然也没有大量使用静态调用......其中 Laravel 大量使用。
我知道测试静态调用是可怕的.. 但它可以做到。在我认为好的实践中(请随时纠正我),我试图模拟这些类以增加测试组件的分离度。
我正在使用\Mockery::mock('alias:{classname}') 功能来捕获这些静态调用。
例如,要检查当前登录的用户,可以使用以下方式找到 id:
$user_id = (int)Authorizer::getResourceOwnerId();
但是,测试功能似乎有一些限制,我可能会错误地使用它们 - 确切的问题如下:
测试结构
我现在的情况如下:
class AuthRoutesTest extends TestCase {
// ...
protected $mock_authorizer;
// ...
public function setUp()
{
parent::setUp();
// ...
$this->mock_authorizer
->shouldReceive('getResourceOwnerId')
->andReturnValues(
[null, 3, 3, 3]
);
}
public function tearDown()
{
\Mockery::close();
}
现在是测试 - 所有这些都需要 $user_id = (int)Authorizer::getResourceOwnerId(); 来返回值。
public function testFirst() {
// $user_id is null, then 3, 3 finally 3
}
这就是问题所在:
我想拥有.. 假设 testSecond() 带有一组单独的值:例如 [1,2,null,4]。
每次测试似乎都会重置数组(回到开头)。
注意:-
- 我已尝试再次致电
->shouldReceive('getResourceOwnerId')- 这无济于事 - 我试图将下一个值附加到数组中,但它又从键 0 开始
这可能吗?如果可以,是如何做到的?
(我知道还有其他编码网站的方法。这更多是关于测试现有代码并避免重写 - 至少现在是这样)
【问题讨论】:
标签: php unit-testing laravel static mockery