我应该在应用层服务中测试什么
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
是否需要自己的“单元测试”?
我为我正在从事的项目编写了以下应用程序服务,但很难为它编写一个好的单元测试。
/**
* @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
是否需要自己的“单元测试”?