gpt4 book ai didi

unit-testing - 测试在 Clean 架构中做不止一件事的 Interactor 方法

转载 作者:行者123 更新时间:2023-12-04 05:23:26 26 4
gpt4 key购买 nike

我一直在阅读单元测试& Clean architecture并尝试实现涉及这两件事的东西。

据我了解,Clean 架构的结构使得可以对 Interactor 对象的方法进行单元测试。

但是当用例类似于“创建一个文件,其内容是根据某种格式的某些数据计算出来的”时,我会感到困惑,因为它不是单一的(文件内容的计算和文件的创建,它们都在 用例中)

这里有一些伪代码说明了我的情况:

/* We are in an Interactor (i.e. UseCaseObject)
* This method 1)computes fileContent and 2)writes it into a file.
*/
public void CreateFileFromData(someDataInSomeFormat) {
var parsedData = SomeParser.Parse(someDataInSomeFormat);

string fileContent = ???;

WriteFile(fileContent);
}

我的问题如下:

  1. Interactor 中定义的方法必须是单一的吗? (比如,只做一件事)
  2. 必须对交互器中定义的方法进行单元测试吗? (我看到一个函数,不管是不是单一的,作为一个可测试的单元,如果不正确请纠正我)
  3. 哪个类必须在 Clean 架构中计算 fileContent?

最佳答案

您没有说明用于计算的数据将从何处“加载”,但举例来说,假设数据将从另一个文件中读取。

您的交互器将具有三个依赖项
- 读取文件
- 计算新文件的数据
- 写入文件

public class Interactor
{
public Interactor(IReader reader, ICalculator calculator, IWriter writer)
{ }

public void DoJob()
{
var data = reader.Read();
var calculatedData = calculator.Calculate(data);
writer.Write(calculatedData);
}
}

通过这种方法,Interactor 将负责“组合”完成任务所需的步骤。

您可以通过模拟所有依赖项来简单地测试 Interactor。

地点:
IReaderIWriter网关
ICalculatorUseCase 的实现细节,由 Interactor

使用

Must a method defined in the Interactor be unitary ? (as in, do only one thing)

方法应该做一件事——执行与用例相关的任务。如果任务需要使用网关(外部资源)或任务过于复杂以将其保持在一种方法中 - 您将引入所有必需的单元作为依赖项,交互者的责任是将它们“粘合”在一起。

Must a method defined in the Interactor be unit-tested ? (I see a function, unitary or not, as a testable unit, please correct me if this is incorrect)

仅抽象网关(外部资源)- 然后您可以测试交互器的整个逻辑。如果您首先编写测试 - 您将编写测试并且整个逻辑可以在一个函数中(它可能/应该是丑陋的意大利面条代码,这使得测试通过)。然后,当您看到实现的全貌时,您可以通过将事情转移到专门的类(class)来开始调动员工。

Which class must hold the computation of fileContent in a Clean architecture ?

可以是interactor,如果是简单的一行计算。但我更喜欢引入专门的计算类并将其作为依赖项引入。虽然测试将保留在交互器中,但专用计算类将通过交互器测试进行测试

关于unit-testing - 测试在 Clean 架构中做不止一件事的 Interactor 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49356126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com