【问题标题】:PHPUnit test a class with an expects() method in itPHPUnit 测试一个带有 expects() 方法的类
【发布时间】:2019-06-29 04:39:37
【问题描述】:

问题是我正在模拟的依赖项有一个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 测试用例后,我仍然收到与上面相同的错误消息。 (必须与错误兼容)

【问题讨论】:

    标签: php phpunit


    【解决方案1】:

    你需要使用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 版。

    【讨论】:

    • 我通过在这个类周围包装另一个类来解决它。为了测试您的解决方案,我使用 expects() 和 someOther() 方法创建了一个新的测试类,现在运行测试时出现另一个错误:Declaration of Mock_Test_fa1cb6c5::expects(PHPUnit\Framework\MockObject\Matcher\Invocation $matcher) should be compatible with App\Services\Api\Test::expects()
    • 我无法重现错误消息,请参阅我编辑的帖子以获取有关我如何解决此问题的更多信息。
    • 你可以尝试用 Laravel 5.5 TestCase 类运行它吗?
    • 好吧(第二个)问题仍未解决,但无论如何我都会奖励你赏金。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-03-12
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多