好吧,如果有人正在使用遗留代码并且碰巧使用 Microsoft Moles,我已经对这个主题进行了广泛的挖掘,希望能从我遇到的愤怒和沮丧中拯救一些人。
我尝试使用已接受答案的建议,这意味着转到 Moles 目录(在 C:\Program Files.. 中)并以管理员身份运行命令行实用程序 (moles.exe)。有很多选项,其中之一允许您包含引用的程序集(如上所述)。
但是,即使尝试在没有引用程序集的情况下运行该实用程序,该实用程序最终也会使用预定义的引用程序集路径调用 C# 编译器 (csc.exe),这就是我得出的结论,即 .NET Framework 版本之间会出现混淆。我无法不包含这些装配路径。
我的具体情况是我试图 Mole 一个自定义程序集,但是因为显然我在这台机器上安装了 .NET 4.5,它在编译时抱怨 System.Collections.Generics IReadOnlyCollection、IReadOnlyDictionary,我认为是另一个。
解决方案:我得到的唯一解决方案是使用 Mole 过滤器,我在其他帖子和 Microsoft Moles 网站上读到了该过滤器(主页上有 .NET 4.5 故障排除的特殊链接)。在 Visual Studio 中,我只是通过在解决方案资源管理器中单击右键将 Moles 程序集添加到我引用的自定义程序集的单元测试项目中。然后我尝试构建。对于我收到的每个错误,我都记录了有问题的类,并通过在 moles 文件中添加以下内容将它们排除在 Shimmed 或 Stubbed 之外:
<Moles xmlns="http://schemas.microsoft.com/moles/2010/">
<Assembly Name = "MyCustomAssembly" />
<StubGeneration>
<Types>
<Remove TypeName="ClassThatUsesIReadOnlyCollectionEtc" />
</Types>
</StubGeneration>
<MoleGeneration>
<Types>
<Remove TypeName="ClassThatUsesIReadOnlyCollectionEtc" />
</Types>
</MoleGeneration>
</Moles>
现在很明显,如果您需要从痣/存根生成中排除的类,那么这将不起作用,但是就我而言,它工作得很好,因为有问题的类并不重要,而且我不需要存根或填充任何东西那些课。