Ожидание частичных массивов с использованием фиктивных объектов PHPUnit - PullRequest
9 голосов
/ 22 июля 2011

Каков наилучший способ проверки нескольких ключей массива в предложении PHPUnit with()?

Например, чтобы проверить, вызывает ли метод 2-й аргумент, массив, содержащий ключ 'foo':

$this->stubDispatcher->expects($this->once())
        ->method('send')
        ->with('className', $this->arrayHasKey('foo'));

То, что я хотел бы сделать, это что-то вроде $this->arrayHasKey('foo', 'bar'), но в действительности не совпадает с точным содержимым массива.

Ответы [ 2 ]

9 голосов
/ 29 июля 2011

Вы можете передавать утверждения напрямую ->with(), но они называются по-разному.

Список можно посмотреть на источнике: https://github.com/sebastianbergmann/phpunit/blob/3.5/PHPUnit/Framework/Assert.php#L2097 и далее. Все, что не начинается с «assert» и возвращает new PHPUnit_Framework_*.

Хотя я предполагаю, что ответ Дэвида работает, я думаю, что такой подход, используя logicalAnd(), немного чище / легче для чтения.

$mock->expects($this->once())->method("myMethod")->with(
    $this->logicalAnd(
        $this->arrayHasKey("foo"),
        $this->arrayHasKey("bar")
    )
);

Рабочий пример

<?php


class MyTest extends PHPUnit_Framework_TestCase {

    public function testWorks() {
        $mock = $this->getMock("stdClass", array("myMethod"));
        $mock->expects($this->once())->method("myMethod")->with(
            $this->logicalAnd(
                $this->arrayHasKey("foo"),
                $this->arrayHasKey("bar")
            )
        );
        $array = array("foo" => 1, "bar" => 2);
        $mock->myMethod($array);
    }

    public function testFails() {
        $mock = $this->getMock("stdClass", array("myMethod"));
        $mock->expects($this->once())->method("myMethod")->with(
            $this->logicalAnd(
                $this->arrayHasKey("foo"),
                $this->arrayHasKey("bar")
            )
        );
        $array = array("foo" => 1);
        $mock->myMethod($array);
    }

}

выход

phpunit assertArrayKey.php 
PHPUnit 3.5.13 by Sebastian Bergmann.

.F

Time: 0 seconds, Memory: 6.50Mb

There was 1 failure:

1) MyTest::testFails
Expectation failed for method name is equal to <string:myMethod> when invoked 1 time(s)
Parameter 0 for invocation stdClass::myMethod(array( <string:foo> => <integer:1> )) does not match expected value.
Failed asserting that an array has the key <string:bar>.

/home/edo/test/assertArrayKey.php:27
5 голосов
/ 23 июля 2011

Вы можете использовать обратный вызов, чтобы сделать несколько утверждений.

$this->stubDispatcher->expects($this->once())
     ->method('send')
     ->will($this->returnCallback(function($class, $array) {
             self::assertEquals('className', $class);
             self::assertArrayHasKey('foo', $array);
             self::assertArrayHasKey('bar', $array);
     }));

Редактировать: И если вы хотите сделать базовые утверждения о некоторых параметрах и более сложные утверждения о других, выможно добавить with().

$this->stubDispatcher->expects($this->once())
     ->method('send')
     ->with('className', $this->anything())
     ->will($this->returnCallback(function($class, $array) {
             self::assertArrayHasKey('foo', $array);
             self::assertArrayHasKey('bar', $array);
     }));

Чтобы быть супер ясным, вы никогда не должны передавать $this->returnCallback() в with().То же самое для returnValue() и throwException().Это все директивы, которые говорят макету, что делать при вызове метода.with() для сообщения макету, какие параметры он должен принимать.

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