如何在PHP单元测试中模拟构造函数中调用的方法?

Fab*_*lio 4 php phpunit unit-testing mocking mockery

我在单元测试一个具有在构造函数中调用的方法的类时遇到了麻烦.我不明白如何嘲笑这个.也许我应该使用phpUnit的'setUp'方法?

我正在使用Mockery库.有没有比这更好的工具?

class ToTest
{

   function __construct() {

       $this->methodToMock(); // need to mock that for future tests 

   }

   // my methods class

}
Run Code Online (Sandbox Code Playgroud)

任何建议,将不胜感激.

Sch*_*eis 6

如果你的类很难实例化来测试,那就是你的类做得太多或者在构造函数中工作的代码味道.

http://misko.hevery.com/code-reviewers-guide/

缺陷#1:构造函数执行实际工作

警示标志

  • 构造函数或字段声明中的新关键字
  • 静态方法在构造函数或字段声明中调用
  • 除了构造函数中的字段赋值之外的任何内容
  • 构造函数完成后对象未完全初始化(注意初始化方法)
  • 控制流(构造函数中的条件或循环逻辑)
  • 代码在构造函数中执行复杂的对象图构造,而不是使用工厂或构建器
  • 添加或使用初始化块

无论你的methodToMock函数在构造函数中做了什么,都需要重新考虑.正如其他答案中所提到的,您可能希望使用依赖注入来传递您的类正在执行的操作.

重新思考你的课实际做了什么,并重构,以便更容易测试.这样做的好处是可以让您的类在以后更容易重用和修改.


sec*_*tus 0

只需扩展此类并覆盖您的方法(如果它是公共的或受保护的)。