Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从未调用PHPUnit setUp()_Php_Unit Testing_Oop_Inheritance_Phpunit - Fatal编程技术网

从未调用PHPUnit setUp()

从未调用PHPUnit setUp(),php,unit-testing,oop,inheritance,phpunit,Php,Unit Testing,Oop,Inheritance,Phpunit,当我运行phpunit时,我的fixture为null。我在setUp()中初始化了fixture,但调试表明它从未被调用。我试着让成员变量在子类中被分配适当的值,但它们仍然是空的,这让我感到困惑 // Unit/Base.Unit.php Class BaseUnit extends PHPUnit_Framework_TestCase { // Tests for Base Object methods } // Unit/Validation/Validation.Unit.php

当我运行phpunit时,我的fixture为null。我在setUp()中初始化了fixture,但调试表明它从未被调用。我试着让成员变量在子类中被分配适当的值,但它们仍然是空的,这让我感到困惑

// Unit/Base.Unit.php 
Class BaseUnit extends PHPUnit_Framework_TestCase {
  // Tests for Base Object methods
}

// Unit/Validation/Validation.Unit.php
Class ValidationUnit extends BaseUnit {
  protected $validationClass;
  protected $validData;
  protected $invalidData;

  protected function newValidationInstance($data) {
    return new $this->validationClass($data); 
  }

  public function testValidData() {
    $instance = $this->newValidationInstance($this->validData);
    $this->assertEquals('true', $instance->isValid());
  }
  // ... other tests for validation ...
}

// Unit/Validation/Email.Test.php
Class EmailTest extends ValidationUnit {
  protected function setUp() {
    $this->class = "Email";
    $this->validData = "test@gmail.com";
    $this->invalidData = "fdksljfa"; 
  }
}
正在运行PHPUnit

phpunit --bootstrap /some/config.php Unit/

PHPUnit 4.2.2 by Sebastian Bergmann.

.E
Fatal error: Class name must be a valid object or a string in /opt/bitnami/some/path/Unit/Validation/Validation.Unit.php on line 9
我期望phpunit在EmailTest上启动测试,并在它和它的父类中运行测试。Validation类有大量的子类(Email、ZipCode等),因此在Validation中进行所有测试是一个巨大的胜利

但是我无法调用setUp(),因此无法实例化正确的验证类

编辑

因此,setUp()是在定义setUp()的类中的任何测试之前调用的,而不是在其他测试之前调用的,包括父类中的测试。


为了控制测试的顺序,我让每个类定义一个包含其测试的invokeTests()函数,然后调用其父类的invokeTests()方法。这样,将针对OO层次结构执行测试。

它不会从子类调用setUp方法。按照编写类的方式,不应该运行父类。要忽略父类,请签出:为什么不从子类调用setUp()?为什么我不应该在父类中运行测试?这就是所有测试逻辑的所在。如果您的意思是phpunit cli不应该获取它们,那么我很确定它们不是,因为父类filename是*.Unit.php,电子邮件测试是Email.test.php,这意味着phpunit对测试的搜索忽略了它们。继承不起作用。父类不知道子类中定义了什么。如果您使用两个安装程序实现定义了两个子类,会发生什么情况?就您编写测试的方式而言,您试图使其过于通用。只需使用适当的类和数据在EmailTest中编写测试。啊!似乎已经发现了问题所在。setUp()在该类中的任何测试之前调用,但不一定在其他测试之前调用,包括在其超类中定义的测试。我认为这是有意义的,因为PHPUnit根据函数名而不是层次关系调用函数。