我只需要在单元测试中模拟外部依赖吗?什么是内部依赖?

Roo*_*ian 0 integration-testing unit-testing

我只需要在单元测试中模拟外部依赖吗?

如果我想测试的方法依赖于同一个程序集中的另一个类,该怎么办?我是否必须模拟依赖关系以确保只测试一件事并进行单元测试而不是集成测试?

集成测试是一般测试依赖项的测试,还是我必须区分内部和外部依赖项?

一个例子是一个方法,它有2000行代码和5个方法调用(所有方法来自同一个程序集).

Dav*_*vid 5

通常适当的单元测试是测试在于单一段代码.所以这样的场景就是你开始问自己这两个类的耦合.A类内部是否依赖于B类的实施?或者只需要提供B类实例(注意类和类型之间的区别)?

如果是后者,那么模拟它,因为你没有测试B类,只有A类.

如果是前者,那么听起来像创建测试已经确定了一些可以(甚至应该)重新考虑的耦合.

编辑:(回应你的评论)我想要做到这一点时要记住的一个关键事项(并且将旧单元测试改编成遗留系统真的非常非常困难)是在心理上将类和类型的概念分开.

单元测试不适用于A类,它们适用于A类.A类是A类的实现,它将通过或不通过测试.A类可能对B类具有内部依赖性,需要提供它,但A类可能不会.类型A是功能合同,其单元测试进一步表示.

类型A是否在其合同中指定实现将需要类型B的实例?或者A类是否在内部解析它的实例?类型A是否需要指定此类型,或者类型A的不同实现是否可能不需要类型B的实例?

如果类型A需要类型B的实例,那么它应该在外部公开它,并且您将在测试中提供模拟.如果A类内部解析了B类实例,那么您可能希望使用IoC容器,在运行测试之前,使用类型B的模拟对其进行引导.

无论哪种方式,类型B 应该是模拟而不是实现.这只是打破这种耦合的问题,在传统系统中可能会或可能不会很难.(此外,可能会或可能不会为业务带来良好的投资回报率.)