Заглушка PHPUnit, я хочу заменить функцию в тесте

#php #mocking #phpunit #stub

#php #издевательство #phpunit #заглушка

Вопрос:

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

В моем тесте я хочу полностью удалить эти аргументы и добавить что-то совершенно другое, используя макет в PHPUnit.

Итак: из:

 class ClassBuilder{
  public function buildClass($id, $some, $vars){
    $class = new Class($id, $some, $vars);
    return self::getClass(db_Class, $class);
  }
}
  

Итак, вы можете уловить мою идею здесь, я хочу создать макет, чтобы он выполнял функцию возврата там.

 $myClassStub->getMock("ClassBuilder");
$myClassStub->->expects($this->any())
    ->method("buildClass")
    ->with($this->anything(), $this->anything())
    ->will($this->returnCallback("getClass"));
  

Но я понятия не имею, как это работает. Я думал, что это будет так, но я понятия не имею, куда вообще поместить аргументы. Пожалуйста, помогите мне здесь, очень ценится.

/Marcus

Ответ №1:

Вы можете просто опустить ->with($this->anything(), $this->anything()) exepct, если он есть, чтобы убедиться, что вы передаете в эту функцию как минимум 2 аргумента.

Кроме вас, я понял, что вы хотите вернуть другой класс. В этом случае я бы предложил сделать:

 $yourClassToReturn = "..."; // create the class here

$myClassStub->getMock("ClassBuilder");
$myClassStub->expects($this->any())
    ->method("buildClass")
    ->with($this->anything(), $this->anything())
    ->will($this->returnValue($yourClassToReturn));
  

Комментарии:

1. Ок, значит, $yourClassToReturn — это тоже макет экземпляра? Поэтому я настроил ее таким же образом. Блестяще. Однако класс, который я хочу создать с помощью конструктора, выполнен из другого класса в ClassBuilder. Итак, суть в том, что я хочу запустить функцию в class builder, поскольку это частная функция. Возможно ли это?

2. Дело в том, что когда вы издеваетесь над ClassBuilder, вам больше не нужно заботиться о его частных методах, поскольку ваш поддельный «buildClass» все равно не будет взаимодействовать с ними. Вы просто говорите ей «сделай именно это» без какой-либо логики, что когда-либо. (Если это имеет смысл, и я правильно вас понял? 🙂 )

3. Ну, мои намерения — скорее смоделировать части функциональности и протестировать другие части.

4. @edorian ->-> это опечатка, которую следует удалить?