Laravel Mockery - 这个测试没有执行任何断言

Posted

技术标签:

【中文标题】Laravel Mockery - 这个测试没有执行任何断言【英文标题】:Laravel Mockery - This test did not perform any assertions 【发布时间】:2021-08-17 13:15:46 【问题描述】:

我正在尝试创建一个模拟单元测试,但它给了我这个错误

这个测试没有执行任何断言

public function testGetById()

    $mock = Mockery::mock(PostService::class)->makePartial();
    $mock->shouldReceive('getById')
        ->withSomeOfArgs(1);
        $mock->getById(1);

! get by id→ 这个测试没有执行任何断言 \tests\Unit\PostControllerTest.php:30

测试:1 次冒险时间:0.32 秒警告:不支持 TTY 模式 在 Windows 平台上。

【问题讨论】:

您应该在单元测试中添加断言,例如: $this->assertEqual( ... 我应该使用哪种类型的断言? 你能举个例子吗 【参考方案1】:

很抱歉,我无法 100% 帮助您,我现在无法设置测试项目来尝试此操作,但您可以尝试:

public function testGetById()

    $mock = Mockery::spy(PostService::class);
    // Bind the mock to the Service Container so it gets injected (DI)

    // Execute the code that would run that mock
    $mock->shouldHaveReceived('getById')
        ->withSomeOfArgs(1);

间谍允许您间谍,如果所需的方法在所需的条件下被调用。如果你mock,你只是在“伪造”它会返回或做什么,如果你spy,你将能够断言方法发生了什么。

在official Mockery documentation 上了解更多信息。

【讨论】:

【参考方案2】:

有两种选择。

选项 1:

确保您已使用 `Mockery::close(); 添加了一个 tearDown 方法 然后使用任何断言。 如果您真的不需要,请使用$this->assertTrue(true);

选项 2:

您还可以扩展Mockery\Adapter\Phpunit\MockeryTestCase,而不是通常的PHPUnit\Framework\TestCase。这样你根本不需要添加 phpunit 断言。

【讨论】:

以上是关于Laravel Mockery - 这个测试没有执行任何断言的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 4 中使用 Mockery 模拟自定义类

Laravel 5 - 使用 Mockery 模拟 Eloquent 模型

在 Laravel 中使用 Mockery/phpUnit 时出错

使用 Laravel 和 Mockery

Laravel Mockery 集成测试

Laravel & Mockery - 单元测试关系数据