如何将被模拟的期望添加到被测试的课程中

时间:2011-04-30 11:14:06

标签: php mocking phpunit

要测试的代码

abstract class Parent
{
    public function getSomething(){} //this has to be mocked
}

class Child extends Parent
{
    public function methodWhichIsTested()
    {
        $something = $this->getSomething(); //call to parent method
    }
}

测试

public function setUp()
{
    $this->child = new Child;
}

public function testTheChildMethod()
{
    $this->child->methodWhichIsTested();
}

如何向实例化的类Child添加模拟期望? 我想做点什么:

MockFramework->takeExistingClass('Child')->shouldRecieve('getSomething')->andReturn('whatever');

我的问题是,在实际案例中(不是示例),getSomething方法返回一个依赖项,我需要进行模拟!

我正在使用Mockery,但如果您知道如何使用phpUnit模拟执行此操作,请继续!也许我犯了一个基本的思维错误,请帮我一把!感谢。

1 个答案:

答案 0 :(得分:3)

After you clarfied in chat getSomething的返回值包含

的依赖项
  

抽象类的受保护属性,它通过抽象的另一个公共方法

注入到该抽象中

解决方案是通过其他方法注入该依赖项的模拟

通常,您永远不需要模拟或存储TestSubject的行为。只有当您在全局范围或混合/硬编码对象创建到TestSubject中进行查找时,您才可能看到它的需要,但这些都是代码味道,应该重构。请参阅Sebastian Bergmann关于不可测试代码的文章: