如何模拟一个类的内部方法?

Sha*_*dra 20 .net unit-testing moq

我有一个具有内部方法的类,我想模拟内部方法.但是我无法模仿它,即它不是调用模拟函数而是调用原始函数.有没有办法实现这个目标?

编辑:其实我是Moq的新手.我有许多类的类和方法来使用Moq进行测试.许多类是内部的,许多具有内部方法,许多具有非虚方法.并且无法更改方法和类的签名.任何人都可以让我知道如何使用Moq测试这个场景.或者请建议我一些易于学习和易于使用的其他测试框架.

Dar*_*ryn 61

您可以通过将以下内容添加到AssemblyInfo.cs来轻松模拟内部虚拟方法:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq
[assembly: InternalsVisibleTo("YourTestClass")]
Run Code Online (Sandbox Code Playgroud)

如果您的组件强命名,则需要包括DynamicProxyGenAssembly2公钥(感谢由@bvgheluwe评论;来源:起订量快速入门指南):

[assembly:InternalsVisibleTo("DynamicProxyGenAssembly2,PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
Run Code Online (Sandbox Code Playgroud)

我不明白为什么接受的答案说你永远不应该这样做.当您使用Roy Osherove在"单元测试艺术"第3章中概述的"提取和覆盖"(本地工厂方法)依赖注入技术时,您所做的不是这样吗?

  • 这应该是公认的答案.关于模仿内部方法是否正确的做法,这是另一个辩论,但是如果你已经决定了你想做什么,这就是实现它的方法. (12认同)
  • 这不会起作用.您还需要一个公钥. (2认同)
  • `内部保护虚拟` (2认同)

and*_*ter 28

将方法标记为internal *protected*(当然也是虚拟的)

  • @MrLore之所以起作用,是因为“ _protected_ internal”表示该方法可以由_any_程序集中的子类访问,如果将其标记为“虚拟”,则您的模拟子类可以提供自定义实现 (2认同)

Sky*_*ers 0

为什么要模拟内部方法?

如果您发现需要模拟内部方法,例如回避依赖项或交互,您也许应该考虑重新设计该类。

控制反转依赖注入是一些可能的设计策略,它们可以减少类的耦合并增加类的内聚性,并消除模拟内部方法的需要。

我不认为有明确的途径可以通过 Moq 进行非公开嘲笑。

但是,如果你绝对必须,你可以使用TypeMock Isolator来模拟任何东西。

另外,为了避免在喧嚣中迷失:Thomas 链接了一篇关于使用免费的 MS Moles 来嘲笑非公开成员的好文章。

模拟不可模拟的:将 Microsoft Moles 与 Gallio 结合使用

  • 我强烈不同意:如果你使用 TDD,那么嘲笑内部的东西就是一件很平常的事情…… (7认同)
  • 如果您想为库中其他库不可见的内容编写测试,则模拟内部方法非常有意义。“内部”与“私有”不同。 (3认同)