Как я могу сбросить ожидания () для 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-> точно ()