PHPUnit模拟对象的属性

Ric*_*ola 18 php phpunit unit-testing mocking mockery

我正在锁定一种模拟对象并填充其属性的方法.以下是使用另一个对象的属性的方法示例:

class MyClass {

    private $_object;

    public function methodUnderTest($object) {
        $this->_object = $object;
        return $this->_object->property
    }
}
Run Code Online (Sandbox Code Playgroud)

要单元测试这个方法我应该$objectgetMockBuilder()方法创建一个模拟PHPUnit.但我找不到一种方法来模拟属性$object,只是方法.

Jso*_*owa 26

如果你有带有魔术方法的类,你可以使用:

$mock->method('__get')->with('property')->willReturn('value');
Run Code Online (Sandbox Code Playgroud)

  • 我们如何处理获取多个属性的代码?我为每个属性复制了多行,但有一个例外:“方法名称的期望失败为“__get”...” (2认同)

Ric*_*ola 25

要向模拟对象添加属性,只需像通常使用对象一样设置它们:

$mock = $this->getMockBuilder('MyClass')
             ->disableOriginalConstructor()
             ->getMock();

$mock->property = 'some_value';
Run Code Online (Sandbox Code Playgroud)

$mock->property 现在会回来 'some_value'

感谢akond

我的项目的Ps,这对某些类不起作用,当我尝试调用$mock->property它时只返回NULL

  • 如果你的类使用魔法方法,你可以像这样模拟 __get 的特定属性:`$mock->method('__get')->with('propname')->willReturn('fakevalue');` (12认同)
  • 似乎不适用于“只读”属性 (4认同)
  • 确保您不在原始类中使用魔术方法. (3认同)
  • 如果您的类使用魔术方法,则实际上必须模拟__get()方法并使其返回所需的输出。这就是我某些班级失败的原因 (2认同)
  • @powtac 就像您通常对任何其他方法所做的那样,您只需模拟“__get()”并使其返回所需的值。问题是这种方法并不是真正动态的,并且如果在您正在测试的方法中多次使用,则很难模拟。我可能是错的,但我认为有一种方法可以通过说“当你收到 A 返回 B 时,当你收到 X 返回 Y 时”来模拟方法 (2认同)