来自与测试方法使用的同一类的模拟方法

Posted

技术标签:

【中文标题】来自与测试方法使用的同一类的模拟方法【英文标题】:Mock method from the same class that tested method is using 【发布时间】:2018-07-17 21:00:27 【问题描述】:

我有以下代码:

class Foo() 
    public function someMethod() 
        ...
        if ($this->otherMethod($lorem, $ipsum)) 
            ...
        
        ...
    

我正在尝试测试 someMethod(),我不想测试 otherMethod(),因为它非常复杂并且我有专门的测试 - 在这里我只想模拟它并返回特定值。 所以我尝试:

$fooMock = Mockery::mock(Foo::class)
    ->makePartial();
$fooMock->shouldReceive('otherMethod')
    ->withAnyArgs()
    ->andReturn($otherMethodReturnValue);

我正在测试中

$fooMock->someMethod()

但它使用原始(非模拟)方法 otherMethod() 并打印错误。

 Argument 1 passed to Mockery_3_Foo::otherMethod() must be an instance of SomeClass, boolean given

你能帮帮我吗?

【问题讨论】:

打印什么错误? 打印错误是因为我正在使用的模拟还没有为这个方法准备好,我想模拟这个方法,因为我正在单独测试它。 错误无关紧要 - 主要问题是从测试期间使用的测试方法的服务中模拟一种方法 【参考方案1】:

使用它作为模板来模拟一个方法:

<?php

class FooTest extends \Codeception\TestCase\Test

    /**
     * @test
     * it should give Joy
     */
    public function itShouldGiveJoy()
        //Mock otherMethod:
        $fooMock = Mockery::mock(Foo::class)
           ->makePartial();
        $mockedValue = TRUE;
        $fooMock->shouldReceive('otherMethod')
           ->withAnyArgs()
           ->andReturn($mockedValue);

        $returnedValue = $fooMock->someMethod();
        $this->assertEquals('JOY!', $returnedValue);
        $this->assertNotEquals('BOO!', $returnedValue);
    


class Foo

    public function someMethod() 
        if($this->otherMethod()) 
            return "JOY!";
        
        return "BOO!";
    

    public function otherMethod()
        //In the test, this method is going to get mocked to return TRUE.
        //that is because this method ISN'T BUILT YET.
        return false;
    

【讨论】:

嗯,我很确定这是我在原始帖子中所做和描述的,但它不起作用。我不得不以肮脏的方式处理它并开始执行下一个任务。无论如何,谢谢你的帮助,我会尽快回到这个任务,然后再试一次。 太棒了!我想你正在发生的事情是在“......”部分的某个地方。您的架构基本上是正确的。如果您同意,请支持此答案。 :)

以上是关于来自与测试方法使用的同一类的模拟方法的主要内容,如果未能解决你的问题,请参考以下文章

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

模拟来自同一类的两个方法

如何使用PHPUnit测试一个方法调用了同一个类的其他方法,但是没有返回值

模拟测试和PHP的魔法__get方法

Grails:我如何模拟被测类的其他方法,这些方法可能在测试期间被内部调用

是否可以模拟受保护的属性和方法