问题是我嘲笑的依赖项具有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测试用例后,我仍然收到与上述相同的错误消息。 (必须与错误兼容)
答案 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版。