所以我有一个修改模型对象的服务方法

public function doSomething() {
    $model = new Model();

    // Modify the model with a bunch of private methods

    return $model;
}


如果我想测试doSomething,我实际上只有$ model可以使用。我可以在$ model上声明的唯一方法是使用其公共接口。

$this->assertEquals($model->getName(), 'name');


让我感到困惑的是,我到底在用那个断言测试什么呢?我是在测试getName正常工作还是在测试doSomething正常工作?

为了让我测试doSomething,我必须假设getName有效。那么,如何确定是这种情况?

最佳答案

根据您的代码,我将测试是否返回了Model的实例。然后使用公共访问器或assertAttributeEquals检查对象的属性是否正确。这确实测试了模型的吸气剂,但是具有某些属性的对象正是您期望发生的事情。

虽然在您的课程中同时创建对象和修改对象。我将更改方法,以Model作为参数。这样,在测试中,我可以创建一个mockModel并确保使用适当的参数调用任何公共设置器。这样做,我不必担心Model用于设置属性的任何逻辑。

例如:

测试功能:

public function testDoSomething() {
    $mockModel = $this->getMock('Model');

    $mockModel->expects($this->once())
              ->method('foo')
              ->with('some argument');

    $mockModel->expects($this->once())
              ->method('bar')
              ->with('some other argument');

    $sut = new SUT();

    $sut->doSomething($mockModel);
}


您的函数doSomething只需变为:

public function doSomething(Model $model) {
   /** Do stuff with private methods **/
}


现在,您可以确保将Model的属性设置为适当的值,而不取决于类中可能存在或不存在的逻辑。您还可以帮助指定Model需要填写的合同。您依赖的任何新方法都将在集成/系统测试中出现。

关于testing - 如何测试返回模型的服务方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26477613/

10-12 00:38
查看更多