Intereting Posts
PHP – Как получить частичный вывод при выполнении скрипта? PHP preg_match для поиска и поиска динамического URL-адреса из HTML-страниц Динамическое поле выбора для заполнения текстового поля с использованием AJAX или jQuery и PHP Как вернуть только имена групп с preg_match или preg_match_all? Outlook 2007 получает html-почту как источник с заголовками, другие MUA работают нормально. Зачем? Отправка строковых данных в файл PHP на сервере: строка не отправляется? экспортировать переменную среды оболочки перед запуском команды из скрипта PHP CLI Как передать строку с несколькими значениями, разделенными запятыми, в качестве параметров функции Вставка в базу данных с использованием PDO Переназначение URL-адреса IIS + PHP nginx: 502 Bad Gateway с curl / https на Mac OS X Как понизить Wampserver PHP и Apache? Проверьте, имеет ли какой-либо из входов значение Проблема с php short_open_tag Как преобразовать все данные div в изображение и сохранить его в каталог без использования холста?

PHPUnit: проверка того, что массив имеет ключ с заданным значением

Учитывая следующий класс:

<?php class Example { private $Other; public function __construct ($Other) { $this->Other = $Other; } public function query () { $params = array( 'key1' => 'Value 1' , 'key2' => 'Value 2' ); $this->Other->post($params); } } 

И этот тест:

 <?php require_once 'Example.php'; require_once 'PHPUnit/Framework.php'; class ExampleTest extends PHPUnit_Framework_TestCase { public function test_query_key1_value () { $Mock = $this->getMock('Other', array('post')); $Mock->expects($this->once()) ->method('post') ->with(YOUR_IDEA_HERE); $Example = new Example($Mock); $Example->query(); } 

Как проверить, что $params (который является массивом) и передается в $Other->post() содержит ключ с именем «key1», который имеет значение «Value 1»?

Я не хочу проверять весь массив – это всего лишь образец кода, в фактическом коде переданный массив имеет намного больше значений, я хочу проверить только одну пару ключ / значение.

Существует $this->arrayHasKey('keyname') который я могу использовать для проверки $this->arrayHasKey('keyname') ключа.

Существует также $this->contains('Value 1') , который может использоваться для проверки того, что массив имеет это значение.

Я мог бы даже объединить эти два с $this->logicalAnd . Но это, конечно, не дает желаемого результата.

До сих пор я использовал returnCallback, захватывая целые $ params, а затем делал заявления по этому поводу, но есть ли другой способ сделать то, что я хочу?

Related of "PHPUnit: проверка того, что массив имеет ключ с заданным значением"

$this->arrayHasKey('keyname'); метод существует, но его имя assertArrayHasKey :

 // In your PHPUnit test method $hi = array( 'fr' => 'Bonjour', 'en' => 'Hello' ); $this->assertArrayHasKey('en', $hi); // Succeeds $this->assertArrayHasKey('de', $hi); // Fails 

Вместо создания повторно используемого класса ограничений я смог утвердить значение ключа массива, используя существующее ограничение обратного вызова в PHPUnit. В моем случае использования мне нужно было проверить значение массива во втором аргументе для издевающегося метода ( MongoCollection :: secureIndex () , если кому-то интересно). Вот что я придумал:

 $mockedObject->expects($this->once()) ->method('mockedMethod') ->with($this->anything(), $this->callback(function($o) { return isset($o['timeout']) && $o['timeout'] === 10000; })); 

Ограничение обратного вызова ожидает вызываемого в его конструкторе и просто вызывает его во время оценки. Утверждение проходит или не выполняется на основании того, возвращает ли вызываемый true или false.

Для большого проекта я бы рекомендовал создать повторно используемое ограничение (как в приведенном выше решении) или ходатайство о том, чтобы PR # 312 был объединен с PHPUnit, но это сделало трюк для разовой необходимости. Легко понять, как ограничение обратного вызова может быть полезно и для более сложных утверждений.

В результате я создал собственный класс ограничений, основанный на атрибуте one

 <?php class Test_Constraint_ArrayHas extends PHPUnit_Framework_Constraint { protected $arrayKey; protected $constraint; protected $value; /** * @param PHPUnit_Framework_Constraint $constraint * @param string $arrayKey */ public function __construct(PHPUnit_Framework_Constraint $constraint, $arrayKey) { $this->constraint = $constraint; $this->arrayKey = $arrayKey; } /** * Evaluates the constraint for parameter $other. Returns TRUE if the * constraint is met, FALSE otherwise. * * @param mixed $other Value or object to evaluate. * @return bool */ public function evaluate($other) { if (!array_key_exists($this->arrayKey, $other)) { return false; } $this->value = $other[$this->arrayKey]; return $this->constraint->evaluate($other[$this->arrayKey]); } /** * @param mixed $other The value passed to evaluate() which failed the * constraint check. * @param string $description A string with extra description of what was * going on while the evaluation failed. * @param boolean $not Flag to indicate negation. * @throws PHPUnit_Framework_ExpectationFailedException */ public function fail($other, $description, $not = FALSE) { parent::fail($other[$this->arrayKey], $description, $not); } /** * Returns a string representation of the constraint. * * @return string */ public function toString () { return 'the value of key "' . $this->arrayKey . '"(' . $this->value . ') ' . $this->constraint->toString(); } /** * Counts the number of constraint elements. * * @return integer */ public function count () { return count($this->constraint) + 1; } protected function customFailureDescription ($other, $description, $not) { return sprintf('Failed asserting that %s.', $this->toString()); } 

Его можно использовать следующим образом:

  ... ->with(new Test_Constraint_ArrayHas($this->equalTo($value), $key)); 

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

например

 $clientMock->expects($this->once())->method('post')->with($this->callback(function($input) { $this->assertNotEmpty($input['txn_id']); unset($input['txn_id']); $this->assertEquals($input, array( //... )); return true; })); с $clientMock->expects($this->once())->method('post')->with($this->callback(function($input) { $this->assertNotEmpty($input['txn_id']); unset($input['txn_id']); $this->assertEquals($input, array( //... )); return true; })); 

Обратите внимание, что обратный вызов возвращает true. В противном случае это всегда терпит неудачу.

Извините, я не английский.

Я думаю, что вы можете проверить, существует ли ключ в массиве с функцией array_key_exists, и вы можете проверить, существует ли значение с array_search

Например:

 function checkKeyAndValueExists($key,$value,$arr){ return array_key_exists($key, $arr) && array_search($value,$arr)!==false; } 

Используйте !== потому что array_search возвращает ключ этого значения, если он существует, и может быть 0.