在PHPUnit中测试一个包含expects()方法的类

5
问题在于我要模拟的依赖关系具有一个expects()方法。这个类是我正在测试的类的一个依赖项。 < p > setUp()方法 < /p >
$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()兼容

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

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

1个回答

3
您需要使用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。

我通过在此类周围包装另一个类来解决了这个问题。为了测试您的解决方案,我创建了一个新的Test类,其中包含expects()和someOther()方法。现在,在运行测试时,我遇到了另一个错误:“Mock_Test_fa1cb6c5的声明::expects(PHPUnit\Framework\MockObject\Matcher\Invocation $matcher)应与App\Services\Api\Test::expects()兼容”。 - sietse85
我无法重现错误信息,请查看我编辑的帖子以获取有关我如何进行故障排除的进一步信息。 - mrbm
你能否尝试使用Laravel 5.5的TestCase类来运行这个程序? - sietse85
第二个问题仍未解决,但我还是会授予您赏金以感谢您的帮助。谢谢。 - sietse85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接