我应该在应用层服务中测试什么

What should I test in an application layer service

我为我正在从事的项目编写了以下应用程序服务,但很难为它编写一个好的单元测试。

/**
 * @param ReleaseItemRequestDTO $request
 * @return AcknowledgmentResponseDTO
 * @throws CargoNotFound
 * @throws MissingRouteAccess
 * @throws MissingStaffPrivilege
 * @throws StaffNotFound
 * @throws WrongCargoReleaseCode
 */
public function execute(ReleaseItemRequestDTO $request): AcknowledgmentResponseDTO
{
    $releaseCode = ReleaseCode::from($request->releaseCode);
    $staffId = StaffEntityId::from($request->authenticatedStaffId);
    $staff = $this->staffRepository->findById($staffId);
    $cargo = $this->cargoRepository->findByReleaseCode($releaseCode);
    $staff->releaseCargo($cargo, $releaseCode);
    $this->cargoRepository->save($cargo);
    return new AcknowledgmentResponseDTO();
}

如您所见,除了编排域层之外,服务本身不执行任何有意义的逻辑(根据蓝皮书,如果我理解正确的话,它应该如此)。

您对此类服务的单元测试有何建议?

What would be your suggestions to unit test such service ?

不要。

想想您希望通过单元测试此代码获得什么好处,然后考虑您可能实现这些好处的不同方式,以及每种方式的相对成本。

GeePaw Hill 对 TDD 的讨论 Value Premise 提出了一些关于什么样的代码 deserve/require 自动化测试的很好的启发式方法。

我“测试”此代码的首选技术是抓住第二双眼睛并检查代码。即使是一只橡皮鸭也能完成这项工作。添加带有代码审阅者签名和日期的评论,然后继续进行有用的工作。


这是一个更极端的版本

public function execute(ReleaseItemRequestDTO $request): AcknowledgmentResponseDTO {
    return executeV2($request, $this->cargoRepository, $this->staffRepository);
}

public function executev2(ReleaseItemRequestDTO $request, CargoRepository $cargoRepository, StaffRepository $staffRepository): AcknowledgmentResponseDTO {
{
    $releaseCode = ReleaseCode::from($request->releaseCode);
    $staffId = StaffEntityId::from($request->authenticatedStaffId);
    $staff = $staffRepository->findById($staffId);
    $cargo = $cargoRepository->findByReleaseCode($releaseCode);
    $staff->releaseCargo($cargo, $releaseCode);
    $cargoRepository->save($cargo);
    return new AcknowledgmentResponseDTO();
}

谜语:在这种情况下,execute 是否需要自己的“单元测试”?