gpt4 book ai didi

testing - 如何测试返回模型的服务方法?

转载 作者:行者123 更新时间:2023-11-28 21:11:21 25 4
gpt4 key购买 nike

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

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

// Modify the model with a bunch of private methods

return $model;
}

如果我想测试 doSomething,我实际上只有 $model 可以使用。我可以在 $model 上编写断言的唯一方法是使用它的公共(public)接口(interface)。

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

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

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

最佳答案

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

尽管您的类(class)正在创建对象并对其进行修改。我会更改方法以将 Model 作为参数。这样,在我的测试中,我可以创建一个 mockModel 并确保使用正确的参数调用任何公共(public) setter 。这样一来,我就不必担心 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 需要填写的契约(Contract)。您所依赖的任何新方法都会出现在您的集成/系统测试中。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com