【问题标题】:PHPUnit Mock an object's propertiesPHPUnit 模拟对象的属性
【发布时间】:2017-11-18 03:41:58
【问题描述】:

我正在寻找一种模拟对象并填充其属性的方法。 下面是一个使用另一个对象属性的方法示例:

class MyClass {

    private $_object;

    public function methodUnderTest($object) {
        $this->_object = $object;
        return $this->_object->property
    }
}

要对该方法进行单元测试,我应该使用来自PHPUnitgetMockBuilder() 方法创建一个模拟$object。但我找不到模拟$object 属性的方法,只有方法。

【问题讨论】:

  • 为什么不直接设置这些属性而不模拟它们?
  • 我实际上尝试过这样做,但直到今天才知道为什么它从来没有奏效。感谢您的提醒,您实际上可以像通常使用对象一样设置模拟对象的属性
  • 幸运的是,我并没有完全发疯,您提出的简单解决方案适用于我的大多数课程,但对于一对夫妇来说,它不起作用,它只会返回 NULL

标签: php unit-testing mocking phpunit mockery


【解决方案1】:

要向模拟对象添加属性,您只需像通常对对象所做的那样设置它们:

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

$mock->property = 'some_value';

$mock->property 现在将返回 'some_value'

感谢akond

附:对于我的项目,这不适用于某些类,当我尝试调用 $mock->property 时,它只会返回 NULL

【讨论】:

  • 确保不要在原始类中使用魔法方法。
  • 如果您的课程使用魔术方法,您实际上必须模拟 __get() 方法并使其返回所需的输出。这就是我的一些课程失败的原因
  • disableOriginalConstructor() 需要括号来表示它是一个方法,而不是一个属性。否则会报错
  • @powtac 就像您通常使用任何其他方法一样,您只需模拟 __get() 并使其返回所需的值。问题是这种方法并不是真正动态的,如果在您正在测试的方法中多次使用,则很难模拟。我可能错了,但我认为有一种方法可以通过说“当你收到 A 返回 B,当你收到 X 返回 Y”来模拟一个方法
  • 如果你的类使用魔法方法,你可以像这样模拟特定属性的 __get:$mock->method('__get')->with('propname')->willReturn('fakevalue');
【解决方案2】:

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

$mock->method('__get')->with('property')->willReturn('value');

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 2021-10-31
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多