【问题标题】:Mockey/Laravel with static call of Authorizer::getResourceOwnerId带有 Authorizer::getResourceOwnerId 静态调用的 Mockey/Laravel
【发布时间】: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


    【解决方案1】:

    如果您将byDefault() 添加到您的期望中,则可以在setUp() 方法中启动它之后覆盖期望。

    你会这样做:

    public function setUp()
    {
        parent::setUp();
    
        // ...
    
        $this->mock_authorizer
            ->shouldReceive('getResourceOwnerId')
            ->andReturnValues(
                [null, 3, 3, 3]
            )->byDefault();
    }
    

    然后在您的第二个测试用例中,可以覆盖您在 setUp 方法中定义的期望,如下所示:

    public function testSecond() {
        $this->mock_authorizer
            ->shouldReceive('getResourceOwnerId')
            ->andReturnValues(
                [1,2,null,4]
            );
    }
    

    这篇文章:Override Mockery return values 也可能有用。

    您还可以阅读Mockery docs 中的期望和byDefault() 方法。

    另外,我建议您为 Authorizer 类创建一个外观或使用依赖注入,而不是创建一个实例模拟(使用 Mockery 别名),因为实例模拟可能会影响其他类中的测试,从而导致不必要的问题。

    【讨论】:

    • 良好的反应。我会尽快对此进行审查并提供反馈。
    • 是的。抱歉让我等了。我已经摆脱了这个问题,需要移动一些 sprint 项目。
    猜你喜欢
    • 2016-02-16
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2019-12-02
    • 2016-09-12
    • 2013-10-01
    相关资源
    最近更新 更多