PHPUnit Test不使用命名空间

时间:2017-03-24 09:24:35

标签: php unit-testing phpunit

我的PHPUnit测试无效。它抛出了这个错误:

  

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

这是我的文件夹结构:

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文件中使用了命名空间来解决这个问题!

Calculator.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和   喜欢的功能。我想了解命名空间。

谢谢。

1 个答案:

答案 0 :(得分:0)

看起来你没有为自己的课程设置任何自动加载设置。

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

在作曲家文件中

添加autoload块:

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

     "require": {}
 }

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

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

├── composer.json
├── src
│   └── Classes
│       └── Test.php
└── vendor
    ├── autoload.php

不是&#39; Classes&#39;文件夹和src目录。这不是必要的,但这是一种很好的做法。

完成后,您的PHPunit将会知道您的命名空间,因为composer会告诉它。请记住,您需要运行作曲家&#39; dump-autoload&#39;命令,如果你改变任何东西或添加东西。