嘲笑无法在测试方法中调用我的方法

Posted

技术标签:

【中文标题】嘲笑无法在测试方法中调用我的方法【英文标题】:Mockery not able to call my method in testing method 【发布时间】:2018-03-23 07:00:26 【问题描述】:

我正在尝试为下面类中的方法编写测试。但是,当我运行测试时,我得到get_b64 永远不会运行的错误?我看不出这是怎么运行的。

我已经查看了一些用于测试静态方法的嘲弄文档,但据我所知,这个错误不是由于这个原因造成的吗?

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

类:

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);

【问题讨论】:

【参考方案1】:

您静态调用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 类,因此如果您有更多从该类调用的静态函数,您也需要模拟它们。

【讨论】:

以上是关于嘲笑无法在测试方法中调用我的方法的主要内容,如果未能解决你的问题,请参考以下文章

在Jmockit停止嘲笑

Nestjs 单元测试 - 模拟方法守卫

函数在C中嘲笑?

如何在库项目中测试Yii2模型?

在laravel 5.1单元测试中嘲笑hasMany关系

嘲笑php测试中的碳对象