【问题标题】:PHPUnit forces me to require classes before asserting instance ofPHPUnit 强制我在断言实例之前需要类
【发布时间】:2013-04-17 10:18:03
【问题描述】:

我正在测试一个返回另一个类的实例的对象。在内部,该类调用require_once。但是,当我尝试检查返回的对象是否属于该类型时,我会收到以下消息:

InvalidArgumentException: Argument #1 of PHPUnit_Framework_Assert::assertInstanceOf() must be a class or interface name

在调用assertInstanceOf 之前,我在测试中再次调用require_once 后,此消息就会消失。这似乎不对。似乎 PHPUnit 应该足够聪明,可以知道该类已经加载,所以我不必再次加载它。我想错了吗?我的 PHPUnit 配置错误吗?有没有办法避免在我的测试中再次要求这个类?

【问题讨论】:

  • require_once 是在类本身内还是在类文件中、在类外部但在加载类文件时加载的必要条件?
  • assertInstanceOf('MyClass') 不是assertInstanceOf(new MyClass)。确保您传递的是字符串而不是类的实例。
  • 我已经在传递一个字符串
  • 显示你正在做断言的代码。 instanceof 不需要加载类,也不需要自动加载,但也许 PHPUnit 采用的方法可以。
  • 在我的例子中,我必须指定类及其命名空间:$this->assertInstanceOf('Symfony\Component\HttpFoundation\RedirectResponse', $client->getResponse());

标签: php phpunit


【解决方案1】:

一定要使用完整的命名空间:

$this->assertInstanceOf('\Namespace\Subnamespace\MyClass', $obj);

【讨论】:

    【解决方案2】:

    您的单位可能与此类似:

    $this->assertInstanceOf('MyOtherClass', 
        $this->object->someFunctionReturnsOtherClass());
    

    除了这里没问题,注意:phpunit 方法在你的对象之前被调用。既然你说过,你的对象已经在内部做了一个 require_once 意味着直到你的方法被调用,'MyOtherClass' 仍然是一个未定义的类。这正是发生的事情。 Phpunit 函数准备使用 'MyOtherClass' 进行检查,发现它未定义!

    对象自己的 require_once 甚至从未被调用过。这就是为什么你必须自己打电话。如果您使用类似 true == $returnObject instanceOf MyOtherClass 的语句,它会返回相同的错误,因为在解析 PHP 时找不到类定义。

    【讨论】:

      猜你喜欢
      • 2011-01-28
      • 2012-02-16
      • 2011-12-14
      • 2013-10-29
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      相关资源
      最近更新 更多