2017-07-07 1 views
0

Nouveauté de PHPUnit et de tests et suivez le guide de Teamtree House. Mais je suis bloqué à ce stade et je me demande si quelqu'un peut aider. Voici les détails de mes fichiers:PHPUnit Class impossible de se trouver

phpunit.xml --- dans la racine

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

Quand je lance la commande phpunit dans mon terminal, je reçois la sortie suivante:

PHPUnit 6.2.3 by Sebastian Bergmann and contributors. 

Time: 68 ms, Memory: 10.00MB 

No tests executed! 

Mais quand je cours phpunit PigLatinTest.php j'obtiens l'erreur suivante:

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 

Cela m'embrouille vraiment, et je ne trouve pas du tout de solution du tout. Si quelqu'un a un aperçu qui serait apprécié!

+1

Je pense que vous avez posté le boostrap deux fois au lieu du fichier phpunit.xml. –

+0

@MagnusEriksson - merci pour cela. Avoir modifié! –

+0

Avez-vous deux dossiers de fournisseurs différents? Habituellement, vous avez un fournisseur, que vous avez seulement besoin d'inclure _once_ (dans votre fichier bootstrap). Les fichiers de test n'ont pas besoin d'inclure des éléments. C'est ce que le bootstrap est. –

Répondre

2

Votre problème est avec tous les inclus. Ils essaient d'inclure les mauvais fichiers.

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
Dans votre classe de test, nous pouvons supprimer tous include « s. Le bootstrap a déjà pris soin de cela.

Conclusion
Il est important de se rappeler que si vous incluez/besoin d'un fichier qui comprend/nécessite d'autres fichiers, tous les chemins relatifs seront relatifs à partir du fichier qui ne l'y compris, et non le fichier lui-même. La meilleure façon est de faire: require __DIR__ . '/relative/from/this/file.php. La constante magique __DIR__ vous donne le chemin absolu depuis le fichier où il est écrit.

Une fois que vous avez inclus un fichier dans votre projet une fois, toutes les classes et fonctions seront accessibles dans le reste de la requête. Pas besoin de l'inclure plus d'une fois.

+1

Cela a fonctionné à 100%.Merci beaucoup, et pour tout expliquer aussi. –