Intereting Posts

Как сбросить Mock-объект с помощью PHPUnit

Как я могу сбросить ожидания () для PHPUnit Mock?

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

$soapClientMock = $this->getMock('SoapClient', array('__soapCall'), array($this->config['wsdl'])); $this->Soap->client = $soapClientMock; // call via query $this->Soap->client->expects($this->once()) ->method('__soapCall') ->with('someString', null, null) ->will($this->returnValue(true)); $result = $this->Soap->query('someString'); $this->assertFalse(!$result, 'Raw query returned false'); $source = ConnectionManager::create('test_soap', $this->config); $model = ClassRegistry::init('ServiceModelTest'); // No parameters $source->client = $soapClientMock; $source->client->expects($this->once()) ->method('__soapCall') ->with('someString', null, null) ->will($this->returnValue(true)); $result = $model->someString(); $this->assertFalse(!$result, 'someString returned false'); 

С чуть более расследованием кажется, что вы просто вызываете expect () снова.

Однако проблема с примером заключается в использовании $ this-> once (). В течение всего теста счетчик, связанный с ожиданиями (), не может быть сброшен. Чтобы бороться с этим, у вас есть несколько вариантов.

Первый вариант – игнорировать количество раз, когда он вызывается с помощью $ this-> any ().

Второй вариант – нацелить вызов с использованием $ this-> at ($ x). Помните, что $ this-> at ($ x) – это количество обращений к макету, а не конкретному методу, и начинается с 0.

В моем конкретном примере, поскольку макет теста один и тот же раз, и ожидается, что он будет вызван дважды, я также могу использовать $ this-> exact (), причем только один оператор expects (). т.е.

 $soapClientMock = $this->getMock('SoapClient', array('__soapCall'), array($this->config['wsdl'])); $this->Soap->client = $soapClientMock; // call via query $this->Soap->client->expects($this->exactly(2)) ->method('__soapCall') ->with('someString', null, null) ->will($this->returnValue(true)); $result = $this->Soap->query('someString'); $this->assertFalse(!$result, 'Raw query returned false'); $source = ConnectionManager::create('test_soap', $this->config); $model = ClassRegistry::init('ServiceModelTest'); // No parameters $source->client = $soapClientMock; $result = $model->someString(); $this->assertFalse(!$result, 'someString returned false'); 

Претензии для этого ответа, которые помогли с $ this-> at () и $ this-> точно ()