Насмешка, похоже, не работает должным образом

Я пытаюсь использовать Mockery, чтобы определить, правильно ли был вызван мой контроллер.

Я вызываю функцию из своего тестового примера, и метод возвращается правильно. Однако Mockery, похоже, не улавливает этот звонок.

Я попытался выполнить вызов, используя как $this->call, так и $this->client->request. Оба вызова возвращают результат, поэтому Mockery должен считать обращение к контроллеру.

public function testIndex()
{

  /**$entity = \Entity\Classes\Entity::get();
  var_dump($entity);    **/ 
  //This works, and is returning all the entities for that entity

  $headers = array();

  $mock = Mockery::mock('\Entity\Classes\Entity');

  $mock->shouldReceive('index')->once();

  $crawler = $this->custom_request('GET', '/entity/entities/114', $headers); 

  //echo $response = $this->client->getResponse()->getContent();
  //This also works, so the call is being made. custom_request calls $this->client->request method 

  //$this->call('GET', 'http://myurl:1000/entity/entities/114');
      //This alternate method to make the call also work

  $this->assertResponseOk();

}

Ошибка:

1) ClassTest::testIndex
Mockery\Exception\InvalidCountException: Method index() from       
Mockery_0_Entity_Classes_Entity should be called
 exactly 1 times but called 0 times.

person Dynelight    schedule 24.03.2014    source источник


Ответы (1)


Обычно вы внедряете макет во что-то, сейчас он просто сидит в вашем тестовом методе и не используется. Если вы используете Laravel, вам нужно либо заменить фактический Entity\Classes\Entity в контейнере IoC макетом, либо, если Entity\Classes\Entity::index является статическим методом, вам нужно использовать псевдоним, но я бы не рекомендовал это, это может червей.

Редактировать:

Найдите «псевдоним:» на этой странице https://github.com/padraic/mockery/blob/master/docs/05-QUICK-REFERENCE.md для насмешек над псевдонимами. Обратите внимание, что вы, вероятно, захотите запустить тесты, которые используют псевдоним с изоляцией процесса phpunit.

person Dave Marshall    schedule 24.03.2014
comment
Ах. Пока я публиковал это, я изучал некоторые вещи, и я также наткнулся на ваш ответ. Оказывается, мне нужно использовать псевдоним, потому что все статично. Можете ли вы немного указать мне на насмешку над псевдонимом? Я не смог найти ничего существенного на гитхабе проекта. - person Dynelight; 24.03.2014
comment
@Dynelight см. ответ еще раз, добавлена ​​​​ссылка - person Dave Marshall; 25.03.2014
comment
Дэйв, последний вопрос: должны ли фильтры создавать проблемы при использовании этого? Я попытался добавить псевдоним, и я получил «BadMethodCallException: метод Entity\Controllers\Entity::getAfterFilters() не существует для этого фиктивного объекта»… Вы имеете в виду червей? - person Dynelight; 25.03.2014
comment
Кроме того, когда я звоню контроллеру, над которым издеваюсь через GET, разве там не должен вызываться макет? - person Dynelight; 25.03.2014
comment
@Dynelight боюсь, я не уверен, я недостаточно хорошо знаю красноречивый (или ваш код) - person Dave Marshall; 25.03.2014
comment
Мой контроллер вызывал объект статическим способом. Я основывался на вашей ссылке, а также на tutsplus.com/tutorial/easier-testing- with-mockery, и теперь я передаю объект конструктору контроллера, который проверяет, передаю ли я издевательский объект или нет. Затем контроллер вызовет объект Entity. Однако этот объект вызывает методы из других классов. Нужно ли мне издеваться над ними, чтобы проверить, вызываются ли они? Я могу заставить свое утверждение count работать, если вызову локальные методы внутри этого класса, но не внешние методы. - person Dynelight; 25.03.2014