#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
->->
это опечатка, которую следует удалить?