1. Vano

    Vano Новичок

    Сообщения:
    553
    Ваш город:
    Uzhhorod, Ukraine
    Можна ли как-то добиться в PHPUnit такого - ожидаю вызов нескольких методов, с неважно каким параметром, но чтобы всегда был один и тот же?
    Что-то типа:

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

    Вурдалак I'd like to model your domain

    Сообщения:
    6.177
    Ваш город:
    Russia, Moscow
    Address:
    Moscow, Russia
    Country:
    Location on Map:
  3. whirlwind

    whirlwind TDD infected, paranoid

    Сообщения:
    1.941
    Ваш город:
    Spb
    Address:
    Spartanburg, United States
    Country:
    Location on Map:
    тест попахивает
     
    AnrDaemon и AmdY нравится это.
  4. Vano

    Vano Новичок

    Сообщения:
    553
    Ваш город:
    Uzhhorod, Ukraine
    @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);
    }
    Что тут неправильно?
     
  5. AnrDaemon

    AnrDaemon Продвинутый новичок

    Сообщения:
    4.708
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Всё неправильно.
    Откуда у тебя взялись $this->file и $this->cache ?
     
  6. whirlwind

    whirlwind TDD infected, paranoid

    Сообщения:
    1.941
    Ваш город:
    Spb
    Address:
    Spartanburg, United States
    Country:
    Location on Map:
    1) Если этот тест свалится в сете из 1000 тестов по названию теста можно понять в каком методе проблема, куда смотреть?
    Я бы назвал так

    testSave_IfCondition
    testSave_IfNotCondition

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

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

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

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

    Vano Новичок

    Сообщения:
    553
    Ваш город:
    Uzhhorod, Ukraine
    @whirlwind спасибо. Особенно за розвернутость ответа.
    @AnrDaemon file и cache, просто образно написал.
     
    whirlwind нравится это.