phpunit - фиктивные внешние статические методы - PullRequest
0 голосов
/ 26 ноября 2018

Я отчаянно пытаюсь провести модульное тестирование модуля для системы магазинов.Эта система магазинов использует статические методы, которые я должен вызывать в своих функциях, которые я хочу протестировать.

public function toTest() {
    $value = \Context::getData();
    return $value;
}

Теперь, как я могу выполнить модульное тестирование этой функции во время проверки этого статического вызова?Я попытался использовать AspectMock, но это не работает, потому что ему, очевидно, нужен доступ к исходному классу \ Context, который недоступен, поскольку это внешняя система.Я также пытался использовать class_alias для создания своего собственного класса Context, но это тоже не работает, потому что мне нужны разные выходные данные Context в зависимости от того, какую функцию я тестирую.И установка class_alias несколько раз для разных тестов не работает, потому что один и тот же класс не может быть объявлен несколько раз, а @runTestsInSeparateProcesses не дали ожидаемого эффекта.

Редактировать: ни один из дубликатов не дал жизнеспособного решения для моегоситуация, поэтому я не думаю, что это дубликат.Не имея доступа к коду системы магазинов и, особенно, с таким сложным в обслуживании кодом, PHP не облегчает модульное тестирование.Также найденное мной решение должно помочь другим с подобными настройками.

1 Ответ

0 голосов
/ 27 ноября 2018

Я мог бы решить мою проблему с библиотекой Mockery.Я попробовал несколько, но ничего не получилось.С издевательством все кажется возможным сейчас.Эта ссылка действительно помогла: https://robertbasic.com/blog/mocking-hard-dependencies-with-mockery/

Вы можете легко смоделировать статические вызовы для классов, которые вам не принадлежат:

public function methodToTest() {
    return \Context::getData();
}

public function testMethodToTest() {
    m::mock('alias:\Context')
        ->shouldReceive('getData')
        ->andReturn('foo');
}

И даже для экземпляров классов, к которым у вас нет доступаto:

public function methodToTest() {
    $obj = new \Category(5);
    return $obj->id;
}

public function testMethodToTest() {
    m::mock('overload:\Category')
        ->shouldReceive('__construct')
        ->with(5)
        ->andSet('id', 5);
}

Но вы должны помнить, что вам нужны две аннотации phpunit в начале класса:

* @runTestsInSeparateProcesses
* @preserveGlobalState disabled
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...