C# Moles与重构代码

C# Moles与重构代码,c#,refactoring,moles,pex,C#,Refactoring,Moles,Pex,我们正在我的公司进行一个新的绿地项目,我们已经决定在单元测试中使用微软的Moles框架进行模拟。理想情况下,我的经理不想引入任何其他模拟框架,如NSubstitute或Moq,以使项目复杂化。然而,我发现由于Moles生成mock和stub的特性,它不能很好地与重构工具配合使用 例如,我们使用resharper,如果我有以下接口,moles将生成如下的存根: IMyInterface->SIMyInterface 现在,如果我要将IMyInterface重构为另一个名称,例如:IMyNewInt

我们正在我的公司进行一个新的绿地项目,我们已经决定在单元测试中使用微软的Moles框架进行模拟。理想情况下,我的经理不想引入任何其他模拟框架,如NSubstitute或Moq,以使项目复杂化。然而,我发现由于Moles生成mock和stub的特性,它不能很好地与重构工具配合使用

例如,我们使用resharper,如果我有以下接口,moles将生成如下的存根:

IMyInterface->SIMyInterface

现在,如果我要将IMyInterface重构为另一个名称,例如:IMyNewInterface

然后在我的单元测试中,存根类显然没有被重构,因为它基本上有一个不同的名称

我可以看出这是一个大问题,一旦我们得到了许多单元测试的排列,重构将成为一场噩梦,咒语将是“不要改变任何东西!”

有没有人有过类似的经验,或者知道可以处理Moles的重构工具



谢谢梅林和迈克。我的团队决定妥协,只对我们无法用标准工具模拟的类型使用Moles,然后对其他所有类型使用另一个框架,如NSubstitute。

2012年8月16日更新-请使用赝品而不是Moles。Fakes随Visual Studio 2012提供,是Moles完全支持的产品版本。

Moles没有第三方供应商支持;因为,它不是一种官方发布和支持的技术,并且仍在不断变化。我已经创建了一些CodeRush模板,可以生成Moles和Pex属性和测试方法;但是,这对重构类型名没有帮助

我同意,您在代码中重构名称并测试程序集的想法是很好的。具有讽刺意味的是,mole类型无法重构,因为它们来自已编译的程序集。你能做的最好的事情就是重构代码,然后在测试项目中执行搜索和替换(糟糕)。是的,这很难看,尤其是在重构了一些东西之后


莫尔斯建议:

我建议RiSE tweak moles(再次)生成一个未编译的moles项目,而不是生成一个已编译的程序集。我知道组装要容易得多,但我预见到一个巨大的挑战,这将允许开发人员重构mole类中的mole和stub类型名称。此外,重构工具,如重构!Pro应该能够在代码、mole和测试项目中自动重构代码和mole类型名称。

根据第11页“代码生成配置”下的:

也可以禁用编译,在这种情况下,Moles代码生成器将在项目中插入生成的C#源代码

禁用所述编译的方法似乎是将
编译
元素添加为(根)
Moles
元素的子元素(如果不存在),并向所述子元素添加
项目模板
属性,将其值设置为.csproj文件的路径。这是基于我对Visual Studio中XML编辑器显示的上述属性的IntelliSense描述的阅读(取自Moles模式中的文档,在我的计算机上位于
C:\Program Files\Microsoft Visual Studio 10.0\XML\Schemas\Moles.xsd
),内容如下:

空C#项目文件的路径,该文件将用于创建Moles Assembly项目以进行编译


你能把痣往后推吗?我发现这对于紧密耦合的遗留代码很好,但我发现更有用的方法是推动开发人员学习如何将代码重构为松散耦合,并直接支持模拟,而不是在测试时神奇地重写代码以注入模拟。对于其他工具,你可以使用匿名类型来创建存根/模拟,这样就不需要更好的重构工具了。我只是想让你知道,这样你就可以编辑:-)Dho!><我可能是用键盘spaz事件或其他什么东西把这句话的剩余部分删掉了。由于开发人员没完没了的抱怨,我们现在正在删除代码库中所有使用Moles的地方。我建议用赝品替换Moles,该产品是在.NET 4.5和Visual Studio 20120中发布的。这是完全支持的Moles官方产品版本。垫片类型的语法有点不同,很多bug都已经消除了。最后,您必须做最适合您的开发环境的事情。