【问题标题】:PHPUnit Test not working with namespacePHPUnit 测试不适用于命名空间
【发布时间】:2017-03-24 09:24:35
【问题描述】:

我的 PHPUnit 测试不工作。它抛出这个错误:

PHP 致命错误:在 'app\lib\calculator' 中找不到类 /mnt/c/MAMP/htdocs/test/CalcTest.php 在第 7 行

这是我的文件夹结构:

htdocs
  |----app
  |     |---lib
  |          |---calculator.php
  |----test
  |     |---CalcTest.php
  |----vendor
  |     |---autoload.php (and standard folders of composer)
  |
  |----composer.json
  |----composer.lock
  |----index.php
  |----phpunit.xml

我在这些 php 文件中使用了命名空间来掌握这种做法!

计算器.php

<?php 

namespace app\lib;

class Calculator {

     public function add($a, $b) {
          return $a + $b;
     }

     public function render() {
          return "Hello World!";
     }

     public function returnTrue() {
          return true;
     }

     public function returnArray() {
          return ['Hey', 'World', 'This', 'Is', 'Test'];
     }

}

?>

在这里我想要求计算器在变量中具有命名空间:

CalcTest.php:

<?php

class CalcTest extends PHPUnit_Framework_TestCase {

     public function testRenderReturnsHelloWorld() {

          $calc = new \app\lib\calculator();

          $expected = "Hello World";

          $this->assertEquals($expected, $calc->render());

     }

}

?>

phpunit.xml中phpunit的配置:

<?xml version="1.0" encoding="UTF-8" ?>
<phpunit  bootstrap="./vendor/autoload.php"
          color="true"
          convertErrorsToExceptions="true"
          convertNoticesToExceptions="true"
          convertWarningsToExceptions="true"
          stopOnFailures="false"
          syntaxCheck="false"
     >
     <testsuites>
          <testsuite name="PHPUnit Tuts">
               <directory>./test/</directory>
          </testsuite>
     </testsuites>
</phpunit>

当我启动服务器时,即使 index.php 模板也不起作用并抛出 Error-500...

<?php

require_once 'vendor/autoload.php';

$calc = new \app\lib\calculator();

?>

<!DOCTYPE html>
<html lang="en">
<head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <meta http-equiv="X-UA-Compatible" content="ie=edge">
     <title>PHPUnit Tuts</title>
</head>
<body>

     <h1><?php echo $calc->render(); ?></h1>

     <pre><?php var_dump($calc->returnArray()); ?></pre>

     <code><?php echo $calc->add(2,2); ?></code>

</body>
</html>

请不要使用 require 或 require_once 和 喜欢的功能。我想了解命名空间。

谢谢。

【问题讨论】:

  • “app”目录中的类应该如何加载?
  • 在 CalcTest.php 文件中的代码之上添加 use App\lib\Calculator
  • @Banovi Partner GmbH,我已经修改了我的答案,请尝试看看它是否有效。
  • 第 9 行出现错误
  • 你是如何运行 phpunit 的?你在指定你的配置文件吗?

标签: php unit-testing phpunit


【解决方案1】:

您自己的类似乎没有任何自动加载设置。

这就是为什么 phpunit 不知道你的类或命名空间的原因。

在您的作曲家文件中,添加一个autoload 块:

 {
     "name": "acme/test",
     "type": "project",
     "autoload": {
         "psr-4": {
             "": "app/"
         }   
     },  

     "require": {}
 }

这将告诉作曲家将您的应用程序文件夹包含在其自动加载文件中。还要记住,您的命名空间有些不正确。

你应该有一棵看起来像这样的树:

├── composer.json ├── 源 │   └── 类 │   └── Test.php └── 供应商 ├── autoload.php

不是“Classes”文件夹和 src 目录上的大写字母。这不是必需的,但它是一种很好的做法。

一旦你这样做了,你的 PHPunit 就会知道你的命名空间,因为作曲家会告诉它。请记住,如果您更改任何内容或添加内容,则需要运行 composer 的 'dump-autoload' 命令。

【讨论】:

  • 这不是问题,因为 composer.json 中存在自动加载
  • 是的,但除非您告诉 composer 您的应用程序文件在哪里,否则它不会自动找到它们。您的 composer.json 文件中是否已有 autoload 部分?
  • { "autoload": { "psr-4": { "Controllers": "app/", "": "app/" } }, "require-dev" : { "phpunit/ phpunit": "^6.0" } } 请检查。
  • 你运行的是什么版本的php?
  • 如果使用Linux,除了以上所有之外,calculator.php 和Calculator.php 是不同的文件
猜你喜欢
  • 2018-07-29
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2017-11-27
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多