PHPUnit测试一个带有expected()方法的类

sie*_*e85 5 php phpunit

问题是我嘲笑的依赖有一个expects()方法.这个类依赖于我正在测试的类.

setUp()方法

$this->test = $this->getMockBuilder(Request::class)->disableOriginalConstructor()
        ->getMock();
Run Code Online (Sandbox Code Playgroud)

所以当我写我的测试

$this->test->expects($this->once())->method('otherMethod')
        ->willReturn(0);
Run Code Online (Sandbox Code Playgroud)

这会产生错误:

无法重新声明Mock_Test_f21c25ee :: expected()in ...

我怎么解决这个问题?

编辑:

我尝试了建议的解决方案与setMethodsExcept()我现在有一个不同的错误消息.我也在使用PHPunit 7.5

Mock_Test_fa1cb6c5 :: expected(PHPUnit\Framework\MockObject\Matcher\Invocation $ matcher)的声明应该与App\Services\Api\Test :: expected()兼容

注意:忘了提到我正在使用具有自己的TestBase类的Laravel 5.5

Edit2:在我尝试使用默认的PHPUnit测试用例之后,我仍然得到与上面相同的错误消息.(必须与错误兼容)

mrb*_*rbm 3

您需要使用该setMethodsExcept()方法来避免该excepts方法的重新声明。

以这种方式创建模拟应该可以:

$this->request = $this->getMockBuilder(Request::class)
    ->setMethodsExcept(['expects'])
    ->disableOriginalConstructor()
    ->getMock();
Run Code Online (Sandbox Code Playgroud)

编辑:一些澄清:

为了测试您的案例,我执行了以下操作:

class Expecting
{
    public function get()
    {
        return 'my json';
    }

    public function expects()
    {
        return 'who knows what';
    }
}

class ClassA
{
    public function testMe($the_expect_dependency)
    {
        $the_expect_dependency->get();
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的单元测试中,我的声明与您几乎相同:

class ClassATest extends \PHPUnit\Framework\TestCase
{
    public function testThatItCanBeMocked()
    {
        $mock = $this->getMockBuilder(Expecting::class)
            ->setMethodsExcept(['expects'])
            ->disableOriginalConstructor()
            ->getMock();

        $mock->expects($this->once())->method('get')
            ->willReturn('my json');

        $my_obj = new ClassA();
        $my_obj->testMe($mock);
    }
}
Run Code Online (Sandbox Code Playgroud)

删除setMethodsExcept()呼叫时,它给出的错误正是您提到的,不确定可能出了什么问题?

顺便说一句,我正在使用 phpunit 版本 7.5。