PHP 重载单元测试私有(private)属性和方法

标签 php unit-testing simpletest

我在这里阅读了一些关于使用单元测试来测试私有(private)方法和属性的问题。我是单元测试的新手,希望输入我正在尝试的方法,以便我的测试可以访问私有(private)/ protected 属性和方法。

在我进行的测试中,我想确认将特定参数传递给对象会导致设置属性。我正在使用 SimpleTest 进行单元测试教育,我的测试方法如下:

function test__Construction_Should_Properly_Set_Tables() {
  $cv = new CVObject( array( 'tables' => $this->standardTableDef ) );
  $tables = $cv->tables;
  $this->assertEqual( $tables, $this->standardTableDef );
}

然后我在CVObject中写了一个__get方法如下:

function __get( $name ) {
  $trace = debug_backtrace();
  $caller = $trace[1];
  $inTesting = preg_match( '/simpletest/', $caller['file'] );

  if ( $inTesting ) {
    return $this->$name;
  } else {
    trigger_error( 'Cannot access protected property CVObject::$' .
                     $name . ' in ' . $trace[0]['file'] . ' on line ' .
                     $trace[0]['line'],
                    E_USER_NOTICE );
  }
}

我的想法是,如果调用文件来自 SimpleTest,则继续并使该属性可用于测试目的,但如果不是,则触发错误。这使我能够将属性保持私有(private),但能够在测试中使用它,这对于我即将开始编写的特定私有(private)方法来说更为重要。

所以,我的问题是,我是否遗漏了一些非常糟糕的东西并且应该避免这种技术?

最佳答案

如果您发现自己陷入困境并且只是必须访问私有(private)/ protected 属性以启用全面测试,请至少将启用访问的代码放在您的测试或测试框架中。在生产代码中嵌入仅测试代码 a) 使设计复杂化,b) 添加更多必须测试的代码,c) 意味着代码在生产中的运行方式不同。

您可以对 protected 属性使用 Ken 的子类方法,但如果您需要访问 private 并且在 PHP 5.3.2+ 上,您可以使用反射。

function test__Construction_Should_Properly_Set_Tables() {
    $cv = new CVObject( array( 'tables' => $this->standardTableDef ) );
    $tables = self::getPrivate($cv, 'tables');
    $this->assertEqual( $tables, $this->standardTableDef );
}

static function getPrivate($object, $property) {
    $reflector = new ReflectionProperty(get_class($object), $property);
    $reflector->setAccessible(true);
    return $reflector->getValue($object);
}

请注意,getPrivate() 不会像为从父类(super class)继承的属性编写的那样工作,但循环层次结构以找到声明类并不难。

关于PHP 重载单元测试私有(private)属性和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5050066/

相关文章:

PHP字符串数组到javascript字符串数组解析错误

javascript - 使路由仅可通过 javascript 使用

java - 有没有办法在单个@Test 中测试一组输入与一组输出?

unit-testing - 集成测试-可以正确完成吗?

php - 如何设置 PHP + xDebug + (x)Unit + Eclipse 以在单元测试中使用断点?

php - 文件夹写入权限

php - 使用php通过单个提交按钮插入多行数据

css - 使用大众单位的文本不起作用

unit-testing - 类代码前如何写单元测试?

zend-framework - 为 PHP 寻找 "headless browser"等价物以进行 Cucumber 测试