【问题标题】:PHPUnit marking test as risky when defining expectations on passed mock在通过模拟定义期望时,PHPUnit 将测试标记为有风险
【发布时间】:2021-01-27 20:09:42
【问题描述】:

我正在尝试对在数据提供程序中创建并传递给我的测试方法的模拟对象设置测试期望。这很有用,因为我可以在不同的测试用例中重用我的数据提供者,并让测试定义对模拟的期望。但是,phpunit 在案例通过时将此测试标记为有风险,但在未通过时正确地使测试失败。这是已知的不能做的事情吗?

我正在使用 phpunit v9.3

这是一个人为的例子来说明问题:

<?php

use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;

class Test extends TestCase
{
    public function provideMock(): array
    {
        return [
            [$this->createMock(\DateTime::class)],
        ];
    }

    /** @dataProvider provideMock */
    public function testMockPasses(MockObject $mock): void
    {
        $mock->expects($this->once())->method('format')->with('Y-m-d');
        $mock->format('Y-m-d');
    }

    /** @dataProvider provideMock */
    public function testMockFails(MockObject $mock): void
    {
        $mock->expects($this->once())->method('format')->with('Y-m-d');
        $mock->format('Y-m-');
    }
}

我希望这能正常工作,因为我只是将对象传递给方法 - 所有内部 php 的东西。

【问题讨论】:

    标签: php phpunit


    【解决方案1】:

    尝试使用--verbose 键运行 PHPUnit - 它可能会更多地说明将测试标记为有风险的原因。

    【讨论】:

    • 我使用-v 运行,它告诉我风险测试没有断言
    • 这可能是因为createMock() 不打算在测试体之外调用,因为内部模拟实现与测试生命周期紧密相关。您需要在每次测试开始时致电createMock()。如果您需要对使用不同的模拟类运行相同的测试 - 您仍然可以通过数据提供者传递类名。
    • 好吧,有趣。我会根据你的建议尝试重构。谢谢
    猜你喜欢
    • 2014-08-15
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    相关资源
    最近更新 更多