2017-07-07 4 views
0

Neu in PHPUnit und testen und folgen Sie dem Teamtree House's Guide. Aber ich stecke an diesem Punkt fest und frage mich, ob jemand helfen kann. Hier sind die Details von meinen Dateien:PHPUnit-Klasse kann sich nicht selbst finden

phpunit.xml --- in root

<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 --- in ./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 --- in ./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 --- in ./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; 
    } 
} 

Wenn ich den Befehl phpunit in meinem Terminal laufen bekomme ich folgende Ausgabe:

PHPUnit 6.2.3 by Sebastian Bergmann and contributors. 

Time: 68 ms, Memory: 10.00MB 

No tests executed! 

Aber wenn ich rufe phpunit PigLatinTest.php bekomme ich den folgenden Fehler:

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 

Das verwirrt mich wirklich, und ich kann keine Lösung für SO finden. Wenn jemand etwas Einblick hat, würde das geschätzt werden!

+1

Ich denke du hast den Boostrap zweimal anstatt der phpunit.xml gepostet. –

+0

@MagnusEriksson - vielen Dank dafür. Habe geändert! –

+0

Haben Sie zwei verschiedene Herstellerordner? Normalerweise haben Sie einen Anbieter, den Sie nur _once_ (in Ihrer Bootstrap-Datei) angeben müssen. Die Testdateien müssen keine Daten enthalten. Darum geht es beim Bootstrap. –

Antwort

2

Ihr Problem ist mit allen enthalten. Sie versuchen, die falschen Dateien einzuschließen.

Tests/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'; 

Tests/PigLatinTest.php
In Ihrem Test-Klasse, können wir alle include ‚s entfernen. Der Bootstrap hat das schon erledigt.

Fazit
Es ist wichtig, daran zu erinnern, dass, wenn Sie include/erfordern eine Datei, die/erfordert andere Dateien enthält, werden alle relativen Pfade aus der Datei bezogen werden, die die einschließlich der Fall ist, nicht die Datei selbst. Der beste Weg ist zu tun: require __DIR__ . '/relative/from/this/file.php. Die magische Konstante __DIR__ gibt Ihnen den absoluten Pfad von der Datei, in der es geschrieben wird.

Sobald Sie einmal eine Datei in Ihr Projekt aufgenommen haben, werden alle Klassen und Funktionen darin im Rest der Anfrage zugänglich sein. Es muss nicht mehr als einmal eingegeben werden.

+1

Das hat 100% funktioniert.Vielen Dank und auch um alles zu erklären. –