gpt4 book ai didi

unit-testing - 使用 Moq 模拟内部类以进行单元测试

转载 作者:行者123 更新时间:2023-12-03 01:31:28 25 4
gpt4 key购买 nike

假设我有一个类“ClassA”,它依赖于类“ClassB”(注入(inject)到 ClassA 的构造函数中)。我想模拟 ClassB,以便可以单独测试 ClassA。这两个类都是内部类。

如果我错了,请纠正我,但看起来 Moq 只能模拟一个公共(public)类,它有一个公共(public)无参数构造函数,并且要模拟的方法是 public virtual。我真的不想让这些类(class)公开。我是否错过了起订量的某些内容,或者它只是不适合我想做的事情?

我想我可以创建一个 ClassB 实现的接口(interface)(比如“IClassB”),将其注入(inject)到 ClassA 中,然后模拟该接口(interface)。 ClassB 仍然可以是内部的(尽管我意识到接口(interface)方法必须是公共(public)的)。虽然这可行,但我对创建大量接口(interface)感到不安,这些接口(interface)的唯一目的是支持单元测试模拟。想法?

最佳答案

您可以通过添加 InternalsVisibleToAttribute 使内部结构对 Moq 可见。在项目的 assembly.cs 中,如下所示:

[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.

这是我通常会做的。它的目的远不止“支持单元测试模拟”——它可以帮助您构建松散耦合的组件,这始终是值得追求的目标。

关于unit-testing - 使用 Moq 模拟内部类以进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17569746/

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