Unit testing SRP使得类很难测试

Unit testing SRP使得类很难测试,unit-testing,mocking,single-responsibility-principle,Unit Testing,Mocking,Single Responsibility Principle,在重构一些旧的遗留代码时,我尝试尽可能多地应用单一责任原则,因此我最终得到了许多只有一个目的的类。这很好,但当我试图为这些新类编写单元测试时,问题就出现了。有些类很难测试,因为测试很难设置。我需要创建4-5个mock/stub来编写一个测试用例,如果我想覆盖所有代码,我需要编写几个测试用例,所以这只是一个麻烦 很难设置测试(因为它依赖于许多其他类)是一种代码味道吗?如何解决这个问题? 您不需要覆盖所有代码,请使用常识 对于小类,应该很容易确定不变量,所以用断言填充它们,让代码自己测试 将您的系统

在重构一些旧的遗留代码时,我尝试尽可能多地应用单一责任原则,因此我最终得到了许多只有一个目的的类。这很好,但当我试图为这些新类编写单元测试时,问题就出现了。有些类很难测试,因为测试很难设置。我需要创建4-5个mock/stub来编写一个测试用例,如果我想覆盖所有代码,我需要编写几个测试用例,所以这只是一个麻烦

很难设置测试(因为它依赖于许多其他类)是一种代码味道吗?如何解决这个问题?

  • 您不需要覆盖所有代码,请使用常识
  • 对于小类,应该很容易确定不变量,所以用断言填充它们,让代码自己测试
  • 将您的系统划分为多个层,并定义可以插入模拟刺激的位置,以使这些断言生效并验证输出
以下内容:

一个类应该有一个,而且只有一个,改变的理由

请注意,它并没有说“一个类只做一件事,而且只做一件事”。换句话说,如果一个类除了一个之外的所有责任都是不变的,或者如果这些责任都会一起改变,那么这个类拥有多个责任是完全有效的

鲍勃叔叔在书中说:

在SRP的背景下,我们将责任定义为变更的理由(117)

以及:

另一方面,如果应用程序的变化不会导致[多个]责任在不同时间发生变化,则无需将它们分开。事实上,将它们分开会散发出不必要的复杂性。(118)


也就是说,有太多协作者的类是一种气味,应该仔细检查。

我认为您需要发布一些代码。。。至少有一个示例类。在我看来,你有内聚问题,而不是SRP问题。或者你在SRP方面走得太远了,你的课程变得太专业化了。