PHPUnit在其中测试带有Expects()方法的类

时间:2019-02-05 11:09:36

标签: php phpunit

问题是我嘲笑的依赖项具有expects()方法。该类是对我正在测试的类的依赖。

setUp()方法

$this->test = $this->getMockBuilder(Request::class)->disableOriginalConstructor()
        ->getMock();

所以当我编写测试时

$this->test->expects($this->once())->method('otherMethod')
        ->willReturn(0);

这将导致错误:

  

无法在...中重新声明Mock_Test_f21c25ee :: expects()。

我该如何解决?

编辑:

在尝试使用setMethodsExcept()建议的解决方案之后,现在出现了另一条错误消息。我也在使用PHPunit 7.5

  

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

修改:需要澄清的一点:

为了测试您的情况,我执行了以下操作:

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

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

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

删除setMethodsExcept()调用时,它给出的正是您提到的错误,不确定是哪里出了问题?

我正在使用phpunit 7.5 btw版。