对大型解决方案、IOC、Moq 进行改造单元测试

Retrofit unit tests to large solution, IOC, Moq

我正在为用 VB.Net 和 c# 编写的 asp.net 解决方案改进单元测试。 单元测试需要验证当前功能并检查未来的重大更改。

解决方案包括:

1 个 MVC 网络项目 写在vb.net(别问,这是遗留的东西)

10 个其他支持项目,每个项目都包含按逻辑分组的功能 用 C# 编写,每个项目都包含存储库和 DAL

所有 类 都是紧密耦合的,因为还没有在任何地方实施控制反转 (IOC)。

目前要测试控制器有以下堆栈:

第一个问题,为了正确地进行单元测试,我会设置 1 个测试项目并 运行 来自它的所有测试,还是应该为每个项目设置 1 个测试项目以仅测试该 DLL 的功能?

第二个问题,我需要实现IOC才能使用MOQ吗?

第三个问题,IOC有没有可能重构成这样一个庞大的解决方案?

第四个问题,还有哪些其他选项可以尽快完成?

I am in the process of retrofitting unit tests for a asp.net solution written in VB.Net and c#. The unit tests need to verify the current functionality and act as a check for future breaking changes.

当使用没有单元测试且编写时未考虑测试的大型代码库时,很有可能为了编写一组有用的单元测试,您将不得不修改代码,因此您将触发您计划编写单元测试以支持的事件。这显然是有风险的,但可能不会比您每天已经在做的事情风险更大。

您可以采用多种方法(这个问题很可能会因为过于宽泛而被关闭)。一种方法是创建一组良好的集成测试,以确保核心功能正常运行。这些测试不会像单元测试那样快 运行,但它们将进一步与遗留代码库分离。这将为您在引入单元测试时需要进行的任何更改提供良好的安全保障。

如果您有合适的 visual studio 版本,那么您也可以使用 shims(或者如果您有资金,typemock 可能是一个选项)来隔离应用程序的元素在编写初始测试时。因此,例如,您可以创建 dal 的垫片以将其余代码与数据库隔离。

First question, to unit test this correctly would i setup 1 test project and run all tests from it, or should i setup 1 test project for each project to test the functionality of that dll only?

就个人而言,我更喜欢将每个程序集视为一个可测试单元,因此我倾向于为每个包含生产代码的程序集至少创建一个测试项目。这是否有意义,取决于每个程序集中包含的内容......我也倾向于至少有一个测试项目用于顶级项目的集成测试。

Second question, do i need to implement IOC to be able to use MOQ?

简短的回答是否定的,但这取决于您的 类 做什么。如果您想使用 Moq 进行测试,那么如果您的 类 支持依赖注入,那么这样做肯定会更容易,尽管您不需要使用 IOC 容器来实现这一点。通过如下所示的构造函数或通过属性进行手动注入可以形成一个桥梁,以允许注入测试存根。

public SomeConstructor(ISomeDependency someDependency = null) {
    if(null == someDependency) {
        someDependency = new SomeDependency();
    }
    _someDependency = someDependency;
}

Third question, is it even possible refactor IOC into a huge solution like this?

是的,这是可能的。更大的问题是值得吗?您似乎在建议迁移的大爆炸方法。如果您的开发团队在该领域没有太多经验,那么这似乎非常冒险。一种更安全的方法可能是针对应用程序的特定区域并迁移该部分。如果您的程序集是离散的,那么它们应该在您的应用程序中形成相当容易的分割点。了解什么有效,什么无效,以及您感受到的好处和意想不到的痛苦。使用它来决定如何以及何时迁移其余代码。

Forth question, what other options are available to get this done asap?

正如我上面所说,我不确定 ASAP 是否真的是正确的方法。单元测试可以作为一个缓慢的迁移来完成,在您根据业务需求实际更改代码时添加测试。这有助于确保测试人员也被分配来捕获您作为重构的一部分引入的任何错误,这些错误可能需要进行以支持测试。