【问题标题】:Unit test only asserting mock calls单元测试仅断言模拟调用
【发布时间】:2012-06-17 15:08:38
【问题描述】:

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

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

现在我确实有一种方法可以检索用户个人资料图片的缓存 url。此方法从UserMapper 中检索User 对象,并使用存储在User 对象中的图像路径触发ImageRendererrender 方法。

我为这个小函数编写了一个测试,模拟了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 oop unit-testing mocking phpunit


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 基本上..如果你不知道,正确结果是什么,没办法测试。
    • 好吧,您仍然可以运行测试,看看它是否在没有崩溃的情况下执行。就像模糊测试一样。
    • 首先:感谢您的回答。在考虑了我的设计之后,我想到了放弃这段代码。它主要是获取一个User 对象并将用户个人资料图片的路径传递给渲染器(它本身只是缩小图像并返回缓存文件的路径)。这是我可以/应该在控制器中做的事情。
    • 对,这将是比单元测试更多的集成测试。但我不想在答案中也放弃这个词。您可能还想学习防止在各处使用ifs:youtube.com/watch?v=4F72VULWFvc
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2013-08-03
    • 1970-01-01
    • 2020-06-21
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多