php - mock 无法在测试方法中调用我的方法

标签 php testing static phpunit mockery

我正在尝试为下面类中的方法编写测试。但是,当我运行测试时,我收到 get_b64 从未运行的错误?我不明白这是怎么没有运行的。

我已经稍微查看了用于测试静态方法的 mock 文档,但据我所知,这个错误不是由那个引起的?

我需要更改我的测试策略或能够在模拟对象中模拟函数调用吗?

类:

namespace App\Services\Steam;

use App\Services\Steam\Utils;

class Steam
{
    public function profile(string $steamID)
    {
        $b64 = Utils::get_b64($steamID);

        if ($b64 === null) {
            throw new \App\Exceptions\InvalidSteamId();
        }

        return new Profile($b64);
    }   
}

测试用例:

public function test_create_user_object()
{   
    $id = "123"
    $utilsMock  = Mockery::mock(\App\Services\Steam\Utils::class);

    $utilsMock->shouldReceive('get_b64')
                ->once()
                ->with($id)
                ->andReturn($id);

    $steam = new \App\Services\Steam\Steam();
    $steam->profile($id);
}

最佳答案

您静态调用get_b64,这意味着它是从类中调用的,而不是从对象中调用的。

要模拟此类调用,您需要使用 aliases :

public function test_create_user_object()
{   
    $id = "123"
    $utilsMock  = Mockery::mock('alias:\App\Services\Steam\Utils');

    $utilsMock->shouldReceive('get_b64')
                ->once()
                ->with($id)
                ->andReturn($id);

    $steam = new \App\Services\Steam\Steam();
    $steam->profile($id);
}

请记住,它完全取代了 Utils 类,因此如果您有更多从该类调用的静态函数,您也需要模拟它们。

关于php - mock 无法在测试方法中调用我的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46690984/

相关文章:

c++ - 未从编译静态库 C++(Linux 内核)中获取 .a 文件

php - youtube嵌入视频节目 “Video Unavailable”

java - 如何将测试包添加到现有的 ejb 项目中?

swift - Swift 结构定义中的崩溃。有解决方法,但想提高理解

使用 Capybara 测试渐进增强的功能

java - 如何在 Maven 中清理测试源?

C++ 静态方法(在不同的类中)(如 Java 的)

PHP - While 和包装 div

php - 如何在 MySQL 的单元格中存储单个项目的多个值

php - Stream_get_contents 第二次不起作用?