2012-12-15 1 views
1

Если я прокомментирую один из тестов ниже тестовых проходов. Тем не менее, работает как вместе, последний не сможет (даже если я изменить порядок испытаний):Испытательный проход только тогда, когда есть один метод испытаний

код Производство:

<?php 
class View 
{ 
    private $filename; 
    private $data; 

    public function __construct($filename) 
    { 
     $this->filename = $filename; 
     $this->data = []; 
    } 

    public function __set($key, $value) 
    { 
     $this->data[$key] = $value; 
    } 

    public function render() 
    { 
     extract($this->data); 
     ob_start(); 
     require_once $this->filename; 
     return ob_get_clean(); 
    } 

    public function __toString() 
    { 
     return $this->render(); 
    } 
} 

Тест класс:

require_once 'vendor/autoload.php'; 

use org\bovigo\vfs\vfsStream; 
use org\bovigo\vfs\vfsStreamWrapper; 
/** 
* @outputBuffering enabled 
*/ 
class ViewTest extends PHPUnit_Framework_TestCase 
{ 
    public function setUp() 
    { 
     vfsStream::setup(); 
    } 

    /** 
    * @outputBuffering enabled 
    */ 
    public function testRenderSimpleView() 
    { 
     $fileContent = 'index file'; 
     vfsStreamWrapper::getRoot()->addChild(
      vfsStream::newFile('index.php')->withContent($fileContent) 
     ); 
     $view = new View(vfsStream::url('index.php')); 
     echo $view->render(); 
     $this->expectOutputString($fileContent); 
    } 

    /** 
    * @outputBuffering enabled 
    */ 
    public function testRenderViewWithData() 
    { 
     $filename = 'index.php'; 
     $fileContent = '<?php echo $a; ?>'; 
     vfsStreamWrapper::getRoot()->addChild(
      vfsStream::newFile($filename)->withContent($fileContent) 
     ); 
     $view = new View(vfsStream::url($filename)); 
     $view->a = 1; 
     echo $view; 
     $this->expectOutputString('1'); 
    } 
} 

тест выхода:

PHPUnit 3.7.10 by Sebastian Bergmann. 

.F 

Time: 0 seconds, Memory: 3.75Mb 

There was 1 failure: 

1) ViewTest::testRenderViewWithData 
Failed asserting that two strings are equal. 
--- Expected 
+++ Actual 
@@ @@ 
-'1' 
+'' 


FAILURES! 
Tests: 2, Assertions: 2, Failures: 1. 

Это не имеет никакого смысла для меня. Что мне не хватает?

+0

Такое поведение, как правило, из-за проблем с тестовой изоляции. Что-то из Test1 не очищается, вызывая другое поведение, когда Test2 работает после него. Используете ли вы общие/глобальные переменные или синглтоны? Не помогает ли ошибка теста/ошибка/исключение? – Gishu

+0

Нет, я не использую однотонные или глобальные данные. Выходная буферизация влияет на поведение вывода PHP ... –

+0

Имеются ли данные об ошибке тестирования, что-либо? – Gishu

ответ

0

Вы пробовали вызывать $ view-> Dispose() после выполнения теста? Я не эксперт vfsStream, но похоже, что файл останется открытым между тестами, и если текущая позиция файла не будет перемотана после прочтения, она останется в конце файла, что приведет к сбою во втором и последующих тестах ,

+0

$ view-> Утилизация? Класс вида не имеет этого метода ... –

0

Когда это происходит, это обычно происходит потому, что вы не изолируете метод, который вы тестируете правильно. Другими словами, PHPUnit не знает, что вы имеете в виду другой экземпляр определенного метода, который вы тестируете (или аналогичного). Поэтому второй тест всегда терпит неудачу.

В тех случаях, когда вы используете один и тот же метод более одного раза, вы должны использовать объявление «at» с надлежащим счетчиком, который выполняется в коде. Таким образом, PHPUnit знает, что вы имеете в виду, и может правильно выполнить ожидание/утверждение.

Ниже приведен общий пример, где метод «запуска» используется несколько раз:

public function testRunUsingAt() 
    { 
     $test = $this->getMock('Dummy'); 

     $test->expects($this->at(0)) 
      ->method('run') 
      ->with('f', 'o', 'o') 
      ->will($this->returnValue('first')); 

     $test->expects($this->at(1)) 
      ->method('run') 
      ->with('b', 'a', 'r') 
      ->will($this->returnValue('second')); 

     $test->expects($this->at(2)) 
      ->method('run') 
      ->with('l', 'o', 'l') 
      ->will($this->returnValue('third')); 

     $this->assertEquals($test->run('f', 'o', 'o'), 'first'); 
     $this->assertEquals($test->run('b', 'a', 'r'), 'second'); 
     $this->assertEquals($test->run('l', 'o', 'l'), 'third'); 
    }