gpt4 book ai didi

c# - 如何使用 Moq 模拟包含内部抽象方法的抽象类?

转载 作者:太空狗 更新时间:2023-10-29 21:17:19 24 4
gpt4 key购买 nike

我有一个 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
}

我收到以下异常。

Test method TestSomething threw exception:
System.ArgumentException: Type to mock must be an interface or an abstract or non-sealed class. ---> System.TypeLoadException: Method 'DoSomething' in type 'Castle.Proxies.BProxy' from assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.

我可以通过使方法虚拟而不是抽象来解决这个问题,但这不是我想要通过 API 设计完成的。我也尝试通过 mock.Setup(m => m.DoSomething()) 为它提供实现,但无济于事。这对于 Moq 是否可行,或者我是否必须创建一个派生自抽象类 B 的具体测试类?我想避免创建具体类型,这会破坏使用模拟或 stub 框架的某些目的,或者我在这里误导了吗?

编辑 我发现,如果我将方法设为public abstract,则不会出现此问题。所以我想真正的问题是,在使用 InternalsVisibleTo 和 Moq 时,这是否甚至可以通过内部方法实现。

最佳答案

起订量依赖Castle Dynamic Proxy实现它的模拟。在运行时,Moq 会创建一个新程序集并将其加载到您的 AppDomain 中(异常消息中显示的名称 DynamicProxyGenAssembly2)。

问题是这个程序集无法访问您自己代码的内部类和成员,因为它们在您声明它们的程序集之外是不可见的。

解决方法 是用 InternalsVisibleToAttribute 标记您的程序集并指定动态生成的程序集的名称:

[InternalsVisibleTo("DynamicProxyGenAssembly2")]

但是请记住,此解决方案依赖于实现细节,并且可能会在未来的版本中停止工作。

关于c# - 如何使用 Moq 模拟包含内部抽象方法的抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26196829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com