【发布时间】:2010-06-24 20:57:26
【问题描述】:
我们使用 Moq 作为我们的模拟框架,问题是需要可模拟的类型是使用接口完成的,问题是该接口中的任何内容都是公共的,因此被视为我们公共 API 的一部分。
有没有办法让成员可以模拟而不是公开的?
【问题讨论】:
标签: .net interface mocking moq
我们使用 Moq 作为我们的模拟框架,问题是需要可模拟的类型是使用接口完成的,问题是该接口中的任何内容都是公共的,因此被视为我们公共 API 的一部分。
有没有办法让成员可以模拟而不是公开的?
【问题讨论】:
标签: .net interface mocking moq
如果我对您的理解正确,您希望能够将接口应用于类型以支持模拟,但这样做的方式是接口对您的代码的公共使用者不可见。
嗯,一种选择是您可以实现一个internal 接口并使用[assembly:InternalsVisibleToAttribute] 使您的单元测试可以访问内部类型。
[assembly:InternalsVisibleTo("MyUnitTestAssembly")]
internal interface ISomeInterfaceForMocking { ... }
public class MyMockableType : ISomeInterfaceForMocking { ... }
【讨论】:
internal protected 允许派生类也可以访问它们。
http://code.google.com/p/moq/wiki/QuickStart#miscellaneous(参见杂项部分)是否有任何用途(即,用于模拟 protected 东西的语法)?
ISP 说接口上不应该有只有某些人感兴趣的神奇东西。另外,您是否考虑过坚持使用单个 virtual 方法而不是整个接口和/或可模拟位的基本接口?或者只是有一个特定的接口。请记住,如果很难模拟或测试,通常可以在您的代码中改进一些东西(而不是寻找跳圈的技术技巧和/或使用过于强大的模拟框架)。
另外,我敢打赌,如果您发布一个精简版的测试,有人将能够恰到好处地重构它,我们都会学到一些东西。
【讨论】: