php - 仅断言模拟调用的单元测试

标签 php oop unit-testing mocking phpunit

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

它将提供用户个人资料图片的缩略图。该类(我们将其命名为 UserImageManager)将保存一个 UserMapper 实例和一个 ImageRenderer 实例。

现在我确实有一种方法可以检索用户个人资料图片的缓存 URL。此方法从 UserMapper 检索 User 对象,并触发 ImageRendererrender 方法,图像路径存储在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;
}

最佳答案

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

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

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

此外,该方法似乎做得太多而且太复杂。因此,我不会把时间花在创建测试上,而是花在重构类上。

以后你应该在编写代码之前编写测试,这样就不会遇到这种情况。

关于php - 仅断言模拟调用的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11035551/

相关文章:

unit-testing - 如何使用 Go 中的测试包进行测试设置

c# - 组织 using 指令,重新运行测试?

php - 如何通过序列化形式从不同的输入名称中获取值以插入到mysql中?

php - 使用魔法方法有什么缺点?如何在 child 类(class)中缩写它们?

php - 如何使用锂框架构建编辑表单

angularjs - 模拟 promise 链函数

PHP Mailparse 阻塞非 ascii 字符

php - 关联数组与 SplObjectStorage

c# - 两个对象相互引用可以吗?

language-agnostic - 这个图案有名字吗?