单元测试 – 使用Moq模拟内部课程进行单元测试

说我有一个类“ClassA”,它依赖于一个类“ClassB”(注入到ClassA的ctr中)。我想模拟ClassB,以便我可以隔离测试ClassA。这两个类都是内部的。

纠正我,如果我错了,但看起来像Moq只能模拟一个类,如果它是公共的,它有一个公共无参数的构造函数,并且被嘲笑的方法是公共虚拟的。我真的不想让这些课程公开显示。我是否忘记了与Moq的一些东西,还是不适合我想要做的?

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

您可以通过在项目的assembly.cs中添加InternalsVisibleToAttribute,使Moq可以看到内部,如下所示:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

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

但是,如果没有可覆盖的成员,那么嘲弄课的要点是什么?你不会模拟任何东西,所有的电话都将使用实际的实现。你的第二个解决方案,

I guess I could create an interface (say “IClassB”) that ClassB implements, inject that into ClassA, and mock the interface instead.

是我通常会做的它的目的不仅仅是“支持单元测试嘲笑” – 它可以帮助您构建失败的耦合组件,这是始终值得的目标。

http://stackoverflow.com/questions/17569746/mocking-internal-classes-with-moq-for-unit-testing

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:单元测试 – 使用Moq模拟内部课程进行单元测试