Прежде чем я задам этот вопрос, имейте в виду, что это значительно упрощенная версия моего реального контрольного примера.
Я издеваюсь над интерфейсом с целью сбора аргументов, с которыми был вызван определенный метод. Вот мой код:
interface NormalInterface {
public function functionWithOneParameter($parameter);
}
class NormalInterfaceTest {
public function testBasicMockCallback() {
$mock = $this->getMockForAbstractClass(NormalInterface::class);
$names = [];
$cb = function ($name) use (&$names) {
$names[] = basename($name);
return true;
};
$mock->expects($this->exactly(4))
->method("functionWithOneParameter")
->withConsecutive([ $this->callback($cb) ],[ $this->callback($cb) ],[ $this->callback($cb) ],[ $this->callback($cb) ])
->willReturn(true,true, true, true);
$mock->functionWithOneParameter("one");
$mock->functionWithOneParameter("two");
$mock->functionWithOneParameter("three");
$mock->functionWithOneParameter("four");
// If the test ends here it works fine
$this->assertCount(4, $names);
}
}
Вышеуказанный тест работает без линии $this->assertCount(4, $names)
Это означает, что метод макета вызывается ровно 4 раза.
Однако с этой строкой я получаю:
Не удалось утверждать, что фактический размер 14 соответствует ожидаемому размеру 4.
Фактическое содержание $names
является:
array:14 [
0 => "one",
1 => "one", 2 => "two",
3 => "one", 4 => "two", 5 => "three"6 => "one", 7 => "two", 8 => "three", 9 => "four"10 => "one", 11 => "two", 12 => "three", 13 => "four"]
Я думаю, что обратный вызов будет вызываться 4 раза по одному для каждого вызова функции, но, очевидно, он вызывается 14 раз. Я делаю что-то неправильно? Я в корне не понимаю, как это работает?
Обновить:
Проблема решается, если я заменю withConsecutive
с простым: with($this->callback($cb))->willRetrurn(true)
что в данном конкретном случае эквивалентно, но в тех случаях, когда я хочу, чтобы каждый последующий вызов проверял что-то другое, это не будет работать. Я чувствую, что мне не хватает чего-то очень фундаментального в том, как PHPUnit проверяет параметры последовательного вызова.
Задача ещё не решена.
Других решений пока нет …