我有一个类A
,我正在对其中的一个方法进行单元测试,该方法以类B
作为参数。我试图模拟抽象类B
。该类类似于下面的代码:
public abstract class B
{
internal abstract void DoSomething();
}
我的单元测试看起来像这样。
[TestMethod]
public void ClassA_Add_TestSomething()
{
var classA = new A();
var mock = new Mock<B>();
classA.Add(mock.Object);
// Assertion
}
我收到了以下异常:
测试方法TestSomething引发了异常:参数异常:模拟类型必须是接口、抽象或非密封类。 --->类型加载异常:程序集'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 中的类型 'Castle.Proxies.BProxy' 的方法“DoSomething”没有实现。
我可以通过将方法设置为虚拟的而不是抽象的来解决这个问题,但这并不是我想要在 API 设计中实现的。我还尝试通过mock.Setup(m => m.DoSomething())为其提供实现,但没有成功。这是否可能使用Moq完成,或者我将不得不创建一个从抽象类B派生的具体测试类?我想避免创建具体类型,这有点违背mocking或stubbing框架使用的一些目的,或者我被误导了吗?
编辑 我已经发现如果我使方法公开的抽象的,那么这个问题就不会出现。所以我想问的真正问题是,当使用InternalsVisibleTo和Moq时,是否可以对内部方法进行处理?
B.DoSomething
是否有实现,尽管我理解为什么它需要一个实现。可能我没有正确地使用Setup
,但我尝试过的是相当基本的mock.Setup(m=>m.DoSomething()).Callback(() => {});
。 - David Anderson