2015-08-01 2 views
4

Мой тест должен потерпеть неудачу, но она проходит:phpunit: почему этот assertContains проходит?

public function test_getValidProviderCodes(){ 
    $aTest = PRIDE\Reflection::executeStaticMethodForClassName(Apps_DoctorsReports::class, "getValidProviderCodes"); 
    print_r($aTest); 
    $this->assertContains("xxxxxxxxxxxxxx", $aTest); 
} 

Выход:

Testing started at 8:53 AM ... 
PHPUnit 4.6.6 by Sebastian Bergmann and contributors. 

Configuration read from C:\inetpub\Intranet_Local\phpunit\phpunit.xml 

Array 
(
    [0] => 0 
    [1] => 1 
    [2] => 2 
    [3] => MAYER 
    [4] => MAY00 
    [5] => MAYERIC 
    [6] => COH00 
    [7] => COH01 
    [8] => POWELL 
    [9] => POW00 
    [10] => JOHN00 
    [11] => FINO 
    [12] => POL01 
    [13] => NONAP 
    [14] => RAYE00 
    [15] => HOPS00 
    [16] => CHAH00 
) 
- 


Time: 1.24 seconds, Memory: 8.25Mb 

OK (1 test, 1 assertion) 

Значение "xxxxxxxxxxxxxx", очевидно, не в этом массиве. Я использовал эту функцию сотни раз и никогда не видел такого поведения.

(Если изменить $aTest к [], тест терпит неудачу.)


Это еще один тестовый прогон:

public function test_getValidProviderCodes(){ 
    $aTest = PRIDE\Reflection::executeStaticMethodForClassName(Apps_DoctorsReports::class, "getValidProviderCodes"); 
    $this->assertContains("S01", implode(", ", $aTest)); 
} 

Выход:

Testing started at 9:04 AM ... 
PHPUnit 4.6.6 by Sebastian Bergmann and contributors. 

Configuration read from C:\inetpub\Intranet_Local\phpunit\phpunit.xml 


Failed asserting that '0, 1, 2, M01, M03, M04, M05, N02, C01, C02, C03, C04, P01, P02, P03, P04, P05, P06, P07, R01, H01, J01, J02' contains "S01". 
C:\inetpub\Intranet_Local\phpunit\library\classes\apps\DoctorsReportsTest.php:61 



Time: 1.54 seconds, Memory: 8.75Mb 


FAILURES! 
Tests: 1, Assertions: 1, Failures: 1. 
+0

Hi @Keith, что вы думаете о моих решениях? – Matteo

+1

@Matteo Это хорошо. Я забыл отметить это как принято. –

+0

Hi @Keith, спасибо, добро пожаловать! – Matteo

ответ

3

assertContains может проверьте также идентификатор объекта (поведение по умолчанию). Поэтому, чтобы пропустить это, вам нужно передать необязательный флаг методу. Эта проблема уже рассмотрена here on github.

Так сделать не удается тест, просто передать в последний необязательный параметр checkForNonObjectIdentity значение true следующим образом:

public function test_getValidProviderCodes(){ 

    $aTest = 
     array(
      0,1,2,'MAYER' 
     ); 
    print_r($aTest); 
    $this->assertContains(
     "xxxxxxxxxxxxxx", 
     $aTest, 
     'message', 
     false,true,true); 

} 

с выходом:

Failed утверждая, что массив содержит «XXXXXXXXXXXXXX» ,

Надеется, что это поможет

0

По состоянию на января 2017 года, PHPUnit appears to have a regression bug, что вызывает такое поведение, и для которых установка checkForNonObjectIdentity флага не является решением проблемы.

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

$this->assertTrue(in_array($arguments, $calls, TRUE)); 

The third argument to in_array is the strict flag, которая заставляет проверку типа при установке в TRUE.

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

protected function assertCalledWith($mock, $method, $arguments) { 
    $calls = $mock->getCalls($method); 
    $mockName = get_class($mock); 
    $error = "Failed asserting that $mockName->$method() was called with specified args."; 
    $this->assertTrue(in_array($arguments, $calls, TRUE), $error); 
} 
Смежные вопросы