PHPUnit exactly anything

Vano

Новичок
Можна ли как-то добиться в PHPUnit такого - ожидаю вызов нескольких методов, с неважно каким параметром, но чтобы всегда был один и тот же?
Что-то типа:

PHP:
$object1->expects($this->once())->with($this->anything())
//как-то сохранить что это было в параметре
$exactlyAsPrevious = ???
//и
$object2->expects($this->once())->with($exactlyAsPrevious);
 

Vano

Новичок
@whirlwind а почему?
Хочу добиться от метода,к примеру, чтобы он сохранял в файл и в кеш одну и ту же константу, его же класса.
Давайте попробуем написать:

Код:
class A
{
    private const LESHA = 'Lesha';
    private const PETYA = 'Ughuwewewe';

    public function save(bool $condition)
    {
        if ($condition) {
            $this->file->wirte(self::LESHA);
            $this->cache->save('name', self::LESHA);
        } else {
            $this->file->wirte(self::PETYA);
            $this->cache->save('name', self::PETYA);
        }
    }
}

// unit
public function testWithTrueParameter()
{
    $this->file->expects($this->once())
        ->method('write')
        ->with($this->anything());

    $this->cache->expects($this->once())
        ->method('save')
        ->with($this->anything());

    $this->a->save(true);
}
Что тут неправильно?
 

AnrDaemon

Продвинутый новичок
Всё неправильно.
Откуда у тебя взялись $this->file и $this->cache ?
 

whirlwind

TDD infected, paranoid
@whirlwind а почему?

Что тут неправильно?
1) Если этот тест свалится в сете из 1000 тестов по названию теста можно понять в каком методе проблема, куда смотреть?
Я бы назвал так

testSave_IfCondition
testSave_IfNotCondition

2) Есть два типа тестирования: тестирование состояния и тестирование поведения. Здесь тестирование поведения - то есть тест взаимодействия со смежными интерфейсами. Что говорит этот тест? Тест говорит: запиши что нибудь. Если не смотреть в код класса, то из теста непонятно что конкретно юнит должен делать. Условие теста нечеткое - тест теряет характер спецификации и документации - тест не очень хороший.

3) Если возникают проблема при написании теста, то проблема не в тесте, а в дизайне. Используй декоратор поверх основного стораджа и сделай в нем кэш. И первоначальная проблема просто исчезнет.

Всегда - тяжело сформулировать тест/тест большой/много фикстуры/непонятный - проблема в дизайне.

PS. Думал, думал что мне здесь не нравится. Вообще здесь смешан сервисный слой и предметная область. Самое очевидное и правильное тут имхо разделить ответственности. Атрибуты инкапсулировать в VO - этим редуцируем сложность тестирования условия. А сервисный слой разбирает VO и сохраняет. Ну а кеш поверх стораджа прозрачно для потребителей - это классика.
 
Последнее редактирование:
Сверху