3

我一直在阅读有关单元测试和清洁架构的内容,并尝试实现涉及这两件事的东西。

据我了解,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. 必须对 Interactor 中定义的方法进行单元测试吗?(我看到一个函数,无论是否单一,作为可测试单元,如果不正确,请纠正我)
  3. 哪个类必须在 Clean 架构中进行 fileContent 的计算?
4

2 回答 2

2

您没有告诉从哪里“加载”计算数据,但例如假设数据将从另一个文件中读取。

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

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。

其中:
IReaderand IWriterare Gateways
ICalculatorUseCase的实现细节,由Interactor

Interactor 中定义的方法必须是单一的吗?(如,只做一件事)

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

必须对 Interactor 中定义的方法进行单元测试吗?(我看到一个函数,无论是否单一,作为可测试单元,如果不正确,请纠正我)

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

哪个类必须在 Clean 架构中进行 fileContent 的计算?

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

于 2018-03-19T07:08:33.213 回答
0

Clean Architecture 的一个核心方面是所有应用程序业务逻辑都在 Interactor 方法中。这意味着您还希望将主要测试重点放在通常使用单元测试和低级验收测试的交互器上。

在设计你的交互器方法时,你仍然应该遵循 SRP:应该只有一个改变的理由。你也可以结合Interactors来跟随SRP。

如果文件内容的计算是你的应用程序业务逻辑,它应该在一个 Interactor 方法中。

有关交互器的更详细讨论,请查看我的帖子:https ://plainionist.github.io/Implementing-Clean-Architecture-UseCases/

于 2018-03-19T21:45:30.217 回答