2017-07-07 99 views
0

對PHPUnit不熟悉並且測試並且一直遵循Teamtree House's Guide。但我堅持在這一點上,想知道是否有人可以幫忙。下面是我的文件細節:PHPUnit類找不到自己

phpunit.xml ---

<phpunit backupGlobals="true" bootstrap="tests/bootstrap.php"> 
    <!-- Blacklist the vendor folder --> 
    <filter> 
    <blacklist> 
     <directory>vendor</directory> 
    </blacklist> 
    </filter> 
    <!-- Add the main testsuite --> 
    <testsuite> 
    <directory>tests</directory> 
    </testsuite> 
</phpunit> 

bootstrap.php中---在./tests/bootstrap.php

<?php 
// Get autoloader 
require './vendor/autoload.php'; 

// Get tests 
require './tests/PigLatinTest.php'; 

// Initialise twig 
$loader = new Twig_Loader_Filesystem('./src'); 
$twig = new Twig_Environment($loader); 

PigLatinTest.php ---在./tests/PigLatinTest.php

<?php 
require 'vendor/autoload.php'; 
require 'src/PigLatin.php'; 

class PigLatinTest extends PHPUnit\Framework\TestCase 
{ 
    /** 
    * @test PigLatin 
    */ 
    public function englishToPigLatinWorksCorrectly() 
    { 
    /** 
    * Given I have an english word 
    * If I pass that word to my PigLatin converter 
    * I get back the correctly transformed version 
    */ 
    $word = 'test'; 
    $expectedResult = 'esttay'; 

    $pigLatin = new PigLatin(); 
    $result = $pigLatin->convert($word); 

    $this->assertEquals(
     $expectedResult, 
     $result, 
     "PigLatin conversion did not work correctly" 
    ); 
    } 
} 

PigLatin.php ---在./src/PigLatin.php

<?php 

class PigLatin 
{ 
    public function convert($word) 
    { 
    // Remove first letter of the word 
    $first_letter = substr($word, 0, 1); 
    $new_word = substr($word, 1, strlen($word) - 1); 
    $new_word .= $first_letter . 'ay'; 

    return $new_word; 
    } 
} 

當我運行命令PHPUnit的在我的終端,我得到了以下的輸出:

PHPUnit 6.2.3 by Sebastian Bergmann and contributors. 

Time: 68 ms, Memory: 10.00MB 

No tests executed! 

但是當我運行phpunit PigLatinTest.php我得到以下錯誤:

PHP Fatal error: Uncaught PHPUnit\Runner\Exception: Class 'PigLatinTest' could not be found in 'PigLatinTest.php'. in phar:///usr/local/bin/phpunit/phpunit/Runner/StandardTestSuiteLoader.php:101 

這實在讓我很困惑,而且我根本找不到SO的解決方案。如果有人有一些洞察力,將不勝感激!

+1

我想你發佈了兩次boostrap而不是phpunit.xml。 –

+0

@MagnusEriksson - 謝謝你。已修改! –

+0

你有兩個不同的供應商文件夾?通常,你有一個供應商,你只需要在你的引導文件中包含_once_。測試文件不需要包含東西。這就是Bootstrap的全部內容。 –

回答

2

您的問題是與所有包括。他們試圖包含錯誤的文件。

測試/ bootstrap.php中

<?php 
// Let's use absolute paths instead with the help of __DIR__ which 
// will give us the path to the current folder. 
require __DIR__ . '/../vendor/autoload.php'; // Up one folder where the vendor is 

// Removed the include for PigLatinTest since PHPUnit will handle that. 

// Again, let's use __DIR__ to solve the path issues. 
$loader = new Twig_Loader_Filesystem(__DIR__ . '/../src'); 

$twig = new Twig_Environment($loader); 

// If you're PigLatin-class isn't loaded with autoloading (in your composer.json), 
// let's include it in here. Again, with the help of __DIR__ 
require __DIR__ . '/../src/PigLatin.php'; 

測試/ PigLatinTest.php
在您的測試類,我們可以刪除所有include的。 Bootstrap已經考慮到了這一點。

結論
要記住,如果包含/需要包括/要求的其他文件,所有的相對路徑將是從一個根本的,包括不是文件本身的文件相關文件是很重要的。最好的方法是:require __DIR__ . '/relative/from/this/file.php。魔術常數__DIR__爲您提供寫入文件的絕對路徑。

一旦將文件包含到您的項目中,其中的所有類和函數都可以在請求的其餘部分訪問。無需多次包含它。

+1

這工作100%。非常感謝你,並解釋了一切。 –