php - 如何在 phpunit setUpBeforeClass 方法中创建模拟对象?

标签 php unit-testing phpunit

我想在我的所有测试中都有一个模拟对象,所以我尝试在 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() 方法中)?

最佳答案

每个模拟对象都绑定(bind)到创建它的测试用例实例。由于 setUpBeforeClass() 是一个静态方法,它没有实例并且不能创建模拟对象。

相反,在 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'));
    }
}

关于php - 如何在 phpunit setUpBeforeClass 方法中创建模拟对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7805932/

相关文章:

javascript - Laravel - 验证错误

unit-testing - MIME 解析器测试数据

Xcode 键盘快捷键 : jump to test file?

phpunit 避免模拟的构造函数参数

用于空测试的 PHPUnit 占位符

php - python 中最接近 WordPress 而不是 php 的东西是什么?

php - 检查 XML 属性值

javascript - 使用 jQuery 更新文本框

unit-testing - ExtJS 检查元素是否可见

php - Zend Framework, HelperBroker PHP单元测试