在重构我的代码库时,我发现了一段代码,我想将其提取到一个单独的类中。
它将为用户个人资料图片提供缩略图。该类(我们将其命名为UserImageManager
)将包含UserMapper
的实例和ImageRenderer
的实例。
现在我有一种方法可以检索用户个人资料图片的缓存网址。此方法从User
检索UserMapper
对象,并使用render
对象中存储的图像路径触发ImageRenderer
User
方法。
我为这个微小的函数编写了一个测试,模拟了ImageRenderer
,现在我在这个测试用例中没有一个断言。断言函数的返回值是没有任何意义的,因为它返回缓存文件路径,该路径由模拟的ImageRenderer
返回。
现在我的问题是:它是否仍然是一个有效的单元测试,即使没有断言?或者我应该如何重写我的测试,而不仅仅是检查对模拟对象的调用?
// The unit test
public function renderImageWillReturnCacheImagePath() {
$this->_userImageManager->setImage(
// Returns the ImageRenderer mock
$this->_getImageMock(BASE_PATH . 'uploads/2012-06-06-wegmeister-91792.png', false, false)
);
// Invokes the function
$image = $this->_userImageManager->render('wegmeister');
}
// The method to be tested
public function render($username, $width = false, $height = false) {
$user = $this->_userMapper->getUserByUsername($username);
if($user !== false && trim($user->getImage()) !== '') {
$srcImage = $this->_folderUserImages . $user->getImage();
}
else {
$srcImage = $this->_placeholderUserImage;
}
$dstImage = $this->_image->render($srcImage, 'jpg', $width, $height);
if ($dstImage === false || empty($dstImage)) {
throw new UnexpectedValueException('ImageRenderingFailed');
}
return $dstImage;
}
答案 0 :(得分:2)
没有断言的测试是不完整的测试。
如果您无法想象断言是什么以及如何断言,我会说这意味着您要测试的方法(单位)的结果是未定义的。
由于您没有显示任何规范,也没有告诉该函数返回哪种类型,我能想象的唯一可以测试的是在需要时是否抛出异常。
此外,看起来该方法做得太多而且过于复杂。所以我会花时间不创建测试,而是重构类。
将来你应该在编写代码之前编写测试,所以你不会遇到这种情况。