.net 如何编写内部mockable方法

.net 如何编写内部mockable方法,.net,interface,mocking,moq,.net,Interface,Mocking,Moq,我们使用Moq作为模拟框架,问题是需要模拟的类型是使用接口完成的,问题是接口中的任何内容都是公共的,因此被认为是公共API的一部分 有没有办法让一个成员是可模仿的而不是公共的?如果我正确理解了您的意思,您希望能够将接口应用于支持模仿的类型,但这样做的方式是,您的代码的公共使用者将看不到该接口 一个选项是,您可以实现一个内部接口,并使用[assembly:InternalsVisibleToAttribute]使单元测试可以访问内部类型 [assembly:InternalsVisibleTo("

我们使用Moq作为模拟框架,问题是需要模拟的类型是使用接口完成的,问题是接口中的任何内容都是公共的,因此被认为是公共API的一部分

有没有办法让一个成员是可模仿的而不是公共的?

如果我正确理解了您的意思,您希望能够将接口应用于支持模仿的类型,但这样做的方式是,您的代码的公共使用者将看不到该接口

一个选项是,您可以实现一个
内部
接口,并使用
[assembly:InternalsVisibleToAttribute]
使单元测试可以访问内部类型

[assembly:InternalsVisibleTo("MyUnitTestAssembly")]

internal interface ISomeInterfaceForMocking { ... }

public class MyMockableType : ISomeInterfaceForMocking { ... }
(参见杂项部分)是否有任何用途(例如,模拟
的语法受保护
内容)

ISP说界面上不应该有只有一些人感兴趣的神奇东西。另外,您是否考虑过使用单个
虚拟
方法,而不是整个接口和/或可模拟位的基本接口?或者只是有一个特定的接口。请记住,如果很难进行模拟或测试,那么代码中通常有一些地方可以改进(而不是寻找技术诀窍来跳跃和/或使用功能强大的模拟框架)


此外,我敢打赌,如果你发布一个精简版的测试,有人将能够正确地重构它,我们都会学到一些东西。

这是可行的,但在这种情况下,所有成员都是内部成员,有没有办法对其进行更多的控制?@Keivan-你说的更多控制到底是什么意思?您唯一的其他选择是使成员
受到内部保护
,这将允许派生类也访问它们。