2

コードベースをリファクタリングしているときに、別のクラスに抽出したいコードを見つけました。

ユーザープロフィール写真のサムネイルを提供します。クラス(名前を付けましょう)は、のインスタンスとの UserImageManagerインスタンスを保持します。UserMapperImageRenderer

これで、ユーザーのプロフィール写真のキャッシュされたURLを取得する方法があります。Userこのメソッドは、からオブジェクトを取得し、オブジェクトに格納されている画像パスを使用してのメソッドを UserMapperトリガーします。renderImageRendererUser

私はこの小さな関数のテストを作成し、をモックアウトしました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;
}
4

1 に答える 1

2

アサーションのないテストは不完全なテストです。

何をどのようにアサートするか想像できない場合は、テストしたいメソッド (ユニット) の結果が未定義であることを意味します。

仕様を示しておらず、関数が返す型も伝えていないため、テストできると想像できる唯一のことは、必要に応じて例外がスローされるかどうかです。

さらに、その方法は多すぎて複雑すぎるようです。したがって、テストの作成ではなく、クラスのリファクタリングに時間を費やします。

将来的には、コードを記述する前にテストを記述して、このような状況に陥らないようにする必要があります。

于 2012-06-14T16:28:11.637 に答える