单元测试仅断言模拟调用

时间:2012-06-14 14:43:34

标签: php oop unit-testing mocking phpunit

在重构我的代码库时,我发现了一段代码,我想将其提取到一个单独的类中。

它将为用户个人资料图片提供缩略图。该类(我们将其命名为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;
}

1 个答案:

答案 0 :(得分:2)

没有断言的测试是不完整的测试。

如果您无法想象断言是什么以及如何断言,我会说这意味着您要测试的方法(单位)的结果是未定义的。

由于您没有显示任何规范,也没有告诉该函数返回哪种类型,我能想象的唯一可以测试的是在需要时是否抛出异常。

此外,看起来该方法做得太多而且过于复杂。所以我会花时间不创建测试,而是重构类。

将来你应该在编写代码之前编写测试,所以你不会遇到这种情况。