2013-07-10 75 views
18

假设我有一个类“ClassA”,它对类“ClassB”(注入到ClassA的ctr)有依赖性。我想嘲笑ClassB,以便我可以单独测试ClassA。这两个班都是内部的。用Moq模拟内部类进行单元测试

纠正我,如果我错了,但它看起来像Moq只能嘲笑一个类,如果它是公开的,它有一个公共无参数构造函数,被嘲笑的方法是public virtual。我不想让这些课程公开显示。我是否错过了Moq的一些东西,或者它不适合我想要做的事情?

我想我可以创建一个ClassB实现的接口(比如说“IClassB”),将它注入到ClassA中,然后模拟接口。 ClassB仍然可以是内部的(尽管我意识到接口方法必须公开)。虽然这会起作用,但我对创建大量接口感到不安,它的唯一目的是支持单元测试嘲弄。思考?

回答

45

你可以做内部可见的起订量,加入到项目的assembly.csInternalsVisibleToAttribute,像这样:

为什么"DynamicProxyGenAssembly2",而不是"Moq"?它是为了包含动态生成的代理类型而创建的动态程序集的名称(所有这些都由另一个库处理,Castle的DynamicProxy)由Moq使用。因此,您将类型暴露给动态代理组合,而不是Moq本身。

但是,如果没有可覆盖的成员,嘲笑课程有什么意义?你不会嘲笑任何东西,所有的调用都会使用实际的实现。你的第二个解决方案,

我想我可以创建一个ClassB实现的接口(比如说“IClassB”),将它注入到ClassA中,然后模拟接口。

是我通常会做的。它的目的远远超过“支持单元测试嘲讽” - 它可以帮助您构建可靠的耦合组件,这总是值得我们争取的。

+0

有用的知道,谢谢。不过,我现在决定让这些课程公开(至少是那些正在测试的课程)。我想我已经试图将所有东西都放在内部,但它只是一个桌面应用程序,所以它不像在一个给客户的组装/ API中那样重要。 –

+0

非常有用的帖子,我很InternalsVisibleTo(“IntegrationTests”)不能正常工作。然后它有道理,它不是我的程序集访问它,而是Castle的动态创建的程序集。 –