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章中概述的"提取和覆盖"(本地工厂方法)依赖注入技术时,您所做的不是这样吗?
and*_*ter 28
将方法标记为internal *protected*
(当然也是虚拟的)
为什么要模拟内部方法?
如果您发现需要模拟内部方法,例如回避依赖项或交互,您也许应该考虑重新设计该类。
控制反转和依赖注入是一些可能的设计策略,它们可以减少类的耦合并增加类的内聚性,并消除模拟内部方法的需要。
我不认为有明确的途径可以通过 Moq 进行非公开嘲笑。
但是,如果你绝对必须,你可以使用TypeMock Isolator来模拟任何东西。
另外,为了避免在喧嚣中迷失:Thomas 链接了一篇关于使用免费的 MS Moles 来嘲笑非公开成员的好文章。
模拟不可模拟的:将 Microsoft Moles 与 Gallio 结合使用