PHPUnit тестирует функцию, которая записывает в файл и проверяет содержимое в созданный файл


Я вношу свой вклад в sonata/экспортер, библиотеку, используемую для экспорта данных во многих форматах (CSV, JSON, XML, XLS,...).

Я работаю над устройством записи, которое преобразует логические значения в строки (например, да/нет) путем инкапсуляции другого устройства записи (например, CSVWriter или XlsWriter).

Это мой первый опыт работы с phpunit.

Все модульные тесты, выполненные на существующих авторах, используют эту логику:
- Создайте файл.
- Запись данных в файл с использованием соответствующего формата.
- Сделайте assertEquals на file_get_contents(filename).

Итак, я написал этот тест:

public function setUp()
{
    $this->filename = 'formatedbool.xls';
    $this->sampleWriter = new XlsWriter($this->filename, false);
    $this->trueLabel = 'oui';
    $this->falseLabel = 'non';

    if (is_file($this->filename)) {
        unlink($this->filename);
    }
}

public function testValidDataFormat()
{
    $writer = new FormatedBoolWriter($this->sampleWriter, $this->trueLabel, $this->falseLabel);
    $writer->open();
    $writer->write(array('john', 'doe', false, true));
    $writer->close();

    $expected = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name=ProgId content=Excel.Sheet><meta name=Generator content="https://github.com/sonata-project/exporter"></head><body><table><tr><td>john</td><td>doe</td><td>non</td><td>oui</td></tr></table></body></html>';
    $this->assertEquals($expected, trim(file_get_contents($this->filename)));
}

При отправке моего PR владелец говорит мне:

Просто используйте макет с ожидаемым вызовом метода и проверьте аргумент вызова, это позволит избежать создания файла. видишь https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.mock-objects.examples.with-consecutive.php

Я начал переписывать тесты, используя макет, но у меня есть ошибка в file_get_contents, потому что файл не созданный.

Метод "запись" просто записывает в файл и ничего не возвращает.

Я думаю, он хочет, чтобы я проверил данные после преобразования bools, но перед записью в файл. Как я могу проверить результат содержимого файла, не создавая его на самом деле? Или просто получить доступ к моим данным $во время вызова метода?

РЕДАКТИРОВАТЬ Благодаря @Cerad, код, который я отправил:

public function testValidDataFormat()
{
    $data = array('john', 'doe', false, true);
    $expected =  array('john', 'doe', 'no', 'yes');
    $mock = $this->getMockBuilder('Exporter\Writer\XlsWriter')
                   ->setConstructorArgs(array('formattedbool.xls', false))
                   ->getMock();
    $mock->expects($this->any())
           ->method('write')
           ->with($this->equalTo($expected));
    $writer = new FormattedBoolWriter($mock, $this->trueLabel, $this->falseLabel);
    $writer->open();
    $writer->write($data);
    $writer->close();
}

Я жду ответа владельца проекта.

РЕДАКТИРОВАТЬ PR, объединенный в https://github.com/sonata-project/exporter/pull/56

Author: chalasr, 2015-11-19

1 answers

На этот вопрос ответил @Cerad, прокомментировав вопрос.

PR был принят и объединен, см. https://github.com/sonata-project/exporter/pull/56

 0
Author: chalasr, 2015-11-20 10:50:44