【问题标题】:How to create an mocked object in phpunit's setUpBeforeClass method?如何在 phpunit setUpBeforeClass 方法中创建一个模拟对象?
【发布时间】:2011-12-09 23:51:01
【问题描述】:

我想在我的所有测试中都有一个模拟对象,所以我尝试在 setUpBeforeClass() 方法中创建它,但是这个方法是静态的,所以 getMockBuilder 必须像这样静态调用:

public static function setUpBeforeClass() {

  self::mocked_object = self::getMockBuilder('MockedClass')
  ->disableOriginalConstructor()
  ->getMock();

}

问题是getMockBuilder不能被静态调用:

Argument 1 passed to PHPUnit_Framework_MockObject_MockBuilder::__construct() must be an instance of PHPUnit_Framework_TestCase, null given

有没有机会在 setUpBeforeClass 方法中构建模拟对象,还是每次测试前我都必须构建它(在 public function setUp() 方法中)? p>

【问题讨论】:

  • 你为什么需要这个模拟?你不能在常规设置方法或测试中设置它吗?如果您要为模拟设置期望,您不希望它只创建一次,而是针对每个测试。
  • mocked_object 的方法总是会返回相同的结果,所以这就是为什么我认为最好只实例化一次......无论如何,我可以在 setup 方法中创建它,但我想知道是否它也可以在 setUpBeforeClass 中创建。
  • 不确定是否可行,但我认为这是不好的做法,因为您希望每次隔离测试都使用干净的stub

标签: php unit-testing phpunit


【解决方案1】:

每个模拟对象都与创建它的测试用例实例相关联。由于setUpBeforeClass()是一个静态方法,它没有实例,不能创建mock对象。

相反,在 setUp() 或辅助方法中创建您的模拟,并将它们分配给实例变量或返回它们。

class MyServiceTest extends PHPUnit_Framework_TestCase
{
    function setUp() {
        $this->connection = $this->getMock('MyDatabaseConnection', array('connect', ...));
        $this->connection
                ->expects($this->once())
                ->method('connect');
    }

    function testLogin() {
        $this->connection
                ->expects($this->once())
                ->method('login')
                ->with('bob', 'p4ssw0rd');
        $service = new MyService($this->connection);
        self::assertTrue($service->login('bob', 'p4ssw0rd'));
    }
}

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 2013-05-30
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2017-04-07
    • 2010-09-25
    • 2017-01-15
    • 1970-01-01
    相关资源
    最近更新 更多