Phpunit 在测试类中仅模拟一种方法 - 使用 Mockery

Posted

技术标签:

【中文标题】Phpunit 在测试类中仅模拟一种方法 - 使用 Mockery【英文标题】:Phpunit mock only one method in tested class - using Mockery 【发布时间】:2018-05-26 01:39:53 【问题描述】:

我从一周开始就在学习 phpunit。我不知道如何只模拟测试类中的一种方法。 (这只是一个例子,所以我没有写命名空间)。也许你可以帮助我

class SomeService

    public function firstMethod()
    
        return 'smth';
    
    public function secondMethd()
    
        return $this->firstMethod() . ' plus some text example';
    

和测试:

class SomeServiceUnitTest extends TestCase

    private $someService;

    public function setUp()
    
        parent::setUp();
        $this->someService = new SomeService();
    

    public function tearDown()
    
        $this->someService = null;
        parent::tearDown();
    

    public function test_secondMethod()
    
        $mock = Mockery::mock('App\Services\SomeService');
        $mock->shouldReceive('firstMethod')->andReturn('rerg');
        exit($this->walletService->secondMethd());
    

【问题讨论】:

【参考方案1】:

你可以使用partial mocks,作为你的测试类的例子,你可以这样做:

public function test_secondMethod()

    $mock = Mockery::mock('App\Services\SomeService')->makePartial();
    $mock->shouldReceive('firstMethod')->andReturn('rerg');
    $this->assertEquals('rerg plus some text example', $mock->secondMethd()); 

希望有帮助

【讨论】:

以上是关于Phpunit 在测试类中仅模拟一种方法 - 使用 Mockery的主要内容,如果未能解决你的问题,请参考以下文章

来自另一个类的 PHPUnit 模拟方法

如何从 UWP 类中仅访问一种特定方法?

PHPUnit:如何使用多个参数模拟多个方法调用?

如何在 PHPUnit 中跨多个测试模拟测试 Web 服务?

带有模拟的 PHPUnit 测试覆盖率 API

PHPUnit:如何通过测试方法模拟内部调用的函数