【问题标题】:Mocking a class in PHPUnit在 PHPUnit 中模拟一个类
【发布时间】:2014-04-03 20:17:54
【问题描述】:

我之前嘲笑过几节课,但这一节让我着迷

namespace Test\Library;
class MockClassTest extends \PHPUnit_Framework_TestCase
{
    public $test;

    public function setUp() {
        $this->test = $this->getMock('TestMockClass');

        $this->test->expects($this->any())
                   ->method('test')
                   ->will($this->returnValue(null));
    }

    public function testMock() {
        $result = $this->test->test();
    }
}

namespace Test\Library;
class TestMockClass {
    public function test() {}
} 

看起来很简单,但运行此测试会导致: PHP 致命错误:调用 /home/vagrant/projects/test/module/Application/test/Test/Library/MockClassTest.php 中未定义的方法 Mock_TestMockClass_ac1dda46::test()

这是一个 PHPUnit 错误还是我遗漏了什么?

我正在使用 PHP 5.5.3 和 PHPUnit 3.7.27。

更新(固定): 请看下面的答案

【问题讨论】:

  • 对我来说效果很好。 PHP 5.3.8,PHPUnit 3.7.28。我猜你正在运行其他有错误的代码......
  • 请注意,phpunit 会为每个测试方法调用创建一个新实例,因此将您的期望添加到 setUp 不是一个明智的决定...
  • 正确,这只是概念验证测试
  • 尝试更新你的 phpunit,也许会有帮助。旧版本在模拟对象生成器中存在错误...
  • 我还添加了命名空间,我从原始问题中省略了

标签: php unit-testing phpunit


【解决方案1】:

更新(已修复):查看 PHPUnit: stub methods undefined 后,我修复了该问题。使用命名空间时,getMock() 需要被模拟的类的完全限定命名空间。

我将代码更新为:

namespace Test\Library;

class MockClassTest extends \PHPUnit_Framework_TestCase
{
    public $test;

    public function setUp() {
        $this->test = $this->getMock('Test\Library\TestMockClass');
    }

    public function testMock() {
        $this->test->expects($this->any())
            ->method('test')
            ->will($this->returnValue(null));

        $this->assertEquals(null, $this->test->test());
    }
}

测试运行良好。

【讨论】:

    猜你喜欢
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2014-05-05
    • 2013-09-12
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多