PHPUnit willReturnMap всегда возвращает null - PullRequest
0 голосов
/ 28 мая 2020

У меня есть модульный тест, который использует следующий фиктивный класс

$this->stubHandle = $this->getMockBuilder(Handle::class)->disableOriginalConstructor()->getMock();

Когда я запускаю

$key = new Key($this->stubHandle);
$this->stubHandle->method('__call')->will($this->returnCallback('var_dump'));
$key->nonExistingMethod('element0', 'element1', []);

, он выводит

string(17) "nonExistingMethod"

и

array(3) {
  [0] =>
  string(8) "element0"
  [1] =>
  string(8) "element1"
  [2] =>
  array(0) {
  }
}

, что, я думаю, означает, что первый аргумент метода __call - это строка, а второй аргумент - это массив. Аргументы больше не передаются.

Когда я имитирую возвращаемое значение метода __call как

$this->stubHandle->method('__call')->willReturn(1);

Возвращаемое значение всегда 1, как ожидалось.

Когда Я издеваюсь над возвращаемым значением метода __call, например

$this->stubHandle->method('__call')->willReturnMap(
    [
        ['argument1', null, 'returnValue'],
    ]
);

. Я ожидаю, что возвращаемое значение будет 'returnValue', когда первый аргумент метода __call равен 'argument1', а аргумент секунд - нет. забота. Если первый аргумент не 'argument1', я ожидаю возвращаемое значение null.

Верны ли эти ожидания?

Независимо от того, что я пытаюсь, возвращаемое значение всегда null когда я имитирую это значение с помощью метода willReturnMap.

Если мои ожидания неверны, пожалуйста, подскажите способ достижения sh моих целей - имитировать возвращаемое значение, в зависимости от первого аргумента ( только), а также объясните мне, как применять willReturnMap.

1 Ответ

0 голосов
/ 29 мая 2020

Кажется, мой поиск метода willReturnMap немного сбил меня с толку.
Я исходил из предположения, что использовал null на карте, это будет действовать как «все равно», но буквально означает null.

$this->stubHandle->method('__call')->willReturnMap(
    [
        ['nonExistingMethod', null, 'returnValue'],
    ]
);

означает, что аргументы метода __call должны быть явно 'nonExistingMethod' и null, если вы хотите, чтобы возвращаемое значение было 'returnValue'. Вместо этого любые другие значения аргументов вернут null.
Например, $key->nonExistingMethod(null);

Чтобы карта вернула 'returnValue' в моем примере, это должно было быть:

$this->stubHandle->method('__call')->willReturnMap(
    [
        ['nonExistingMethod', ['element0', 'element1', []], 'returnValue'],
    ]
);
$key->nonExistingMethod('element0', 'element1', []);

Короче ... При использовании сопоставления аргументов значения не могут быть «безразлично».

...