繁体   English   中英

使用代码主体中声明的具体类的单元测试类

[英]unit testing classes that use concrete classes declared in code body

很简单,我想找出的是,有没有办法对这段代码进行干净的单元测试? 我可以实例化它并运行一些断言,但我的意思是实际的单元测试,我将模拟服务 object 以删除正在测试的 class 的任何依赖关系,实际上让它只测试这个 class 的服务(而不是它的依赖服务)。

public class Foo{

    public SomeResult DoSomething(){
        var service = new ConcreteService();
        var foo = service.Execute();
        return foo;
    }

}

我的正常方法是不在我的代码体中创建这种类型的 object,但是鉴于无法更改的情况,我有哪些单元测试选项?

鉴于约束(您无法修改/重新编译该代码),恐怕除了“集成测试”之外您无能为力 - 真正的依赖关系,缓慢的测试。

在方法中实例化一个依赖,而不是接受它作为一个 ctor 或方法参数会使事情变得困难。

正如 Ethan 所说,有痣(但对我个人而言,它似乎并不正确)。 我更喜欢设计更改,而不是帮助我掩盖设计问题的框架。

如果 service.Execute() 是虚拟的,那么大多数 mocking 框架都支持这一点。 我个人使用Rhino.Mocks

请参阅此问题,其中详细介绍了在非接口上使用 Mocking 框架的功能,并讨论了 mocking 框架拦截虚拟调用的功能。

如果它不是虚拟的,并且您无法更改它,那么您可以使用Moles 上面提到的帖子还提到了使用TypeMock的能力,我个人没有使用过。

微软研究网站上对 Moles 的描述:

Moles 是一个轻量级的框架,用于在 .NET 中基于委托的测试存根和弯路。 Moles 可用于绕过任何 .NET 方法,包括密封类型中的非虚拟/静态方法。

我知道您提到这将是您无法更改的情况的一个示例,但我会努力重构 class 以便可以将 ConcreteService 作为依赖项注入。 重构是尝试解决糟糕设计的一种更简单的方法。 从您发布的内容来看,我认为您没有理由不能这样做。

编辑: FWIW,我同意@Gishu。 如果您绝对不能修改 class,例如您不拥有它并且您没有能力修改它,那么集成测试是最好的方法。 然而,如果你能看到代码和它在做什么,我支持我之前所说的,你没有理由不重构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM