假货和 .net Framework 4.6.1 和系统

Fakes and .net Framework 4.6.1 and System

设置 OOB 默认设置时 Visual Studio 2013 更新 5 项目,没有测试设置,使用 4.6.1 的目标框架,向系统添加 Fakes 程序集并设置以下 ShimGenerations:

mscorlib.fakes:

<ShimGeneration>
    <Clear/>
    <Add FullName="System.Collections.ReadOnlyCollectionBase"/>
    <Add FullName="System.ApplicationException"/>
    <Add FullName="System.IO.Path"/>
    <Add FullName="System.Security.SecureString"/>
    <Add FullName="Microsoft.Win32.Registry"/>
    <Add FullName="Microsoft.Win32.RegistryKey"/>
    <Add FullName="System.Activator"/>
    <Add FullName="System.Convert"/>
    <Add FullName="System.Version"/>
    <Add FullName="System.StringComparer"/>
    <Add FullName="System.Threading.Thread"/>
</ShimGeneration>

System.fakes:

<ShimGeneration>
    <Clear/>
    <Add FullName="System.Text.RegularExpressions.Regex"/>
    <Add FullName="System.Diagnostics.FileVersionInfo"/>
    <Add FullName="System.Diagnostics.Process"/>
    <Add FullName="System.Net.CookieContainer"/>
    <Add FullName="System.Net.FtpWebRequest"/>
    <Add FullName="System.Net.FtpWebResponse"/>
    <Add FullName="System.Net.IPAddress"/>
    <Add FullName="System.Net.Dns"/>
    <Add FullName="System.Net.Mail.SmtpClient"/>
    <Add FullName="System.Net.Mail.MailMessage"/>
    <Add FullName="System.Net.NetworkInformation.Ping"/>
    <Add FullName="System.Net.NetworkInformation.PingReply"/>
    <Add FullName="System.Net.NetworkInformation.PingException"/>
    <Add FullName="System.Net.HttpWebRequest"/>
    <Add FullName="System.Net.HttpWebResponse"/>
    <Add FullName="System.Net.WebHeaderCollection"/>
    <Add FullName="System.Net.ServicePoint"/>
    <Add FullName="System.Net.NetworkInformation.NetworkInterface"/>
    <Add FullName="System.Net.Sockets.TcpClient"/>
    <Add FullName="System.Net.Sockets.UdpClient"/>
    <Add FullName="System.Net.Sockets.Socket"/>
    <Add FullName="System.Net.WebRequestMethods"/>
    <Add FullName="System.Net.WebRequest"/>
    <Add FullName="System.Uri"/>
</ShimGeneration>

出现以下错误:

'System.Net.Sockets.SocketClientAccessPolicyProtocol' is obsolete: 'This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.'
[some path\TestFakes\UnitTestProject1\obj\Debug\Fakes\s\f.csproj] some path\TestFakes\UnitTestProject1\f.cs

GENERATEFAKES : error : project compilation failed with exit code 1

这似乎只发生在这种配置下。

我不确定如何解决这个问题,因为我需要拦截大部分 .NET 框架调用。

在这个问题上花了几天时间后,我发现了以下内容。这是下面class"System.Net.Sockets.Socket"的问题。我发现删除这个 shim 生成,然后删除所有 .fakes 程序集,然后删除 the/Fakes 文件夹中的一个 .fakes 文件并使用 "Add Fakes Assembly" 对话框重新创建它,重新创建所有 .fakes基于 /Fakes 文件夹中的 .fakes 文件的程序集,并允许构建代码。

因为我不需要伪造 "System.Net.Sockets.Socket",这是成功构建和重新运行我的单元测试的可接受解决方案。这肯定是这个 class 和 Fakes 框架的问题。

我发现 Fakes 框架是一个很好的框架,但需要更好的支持。像这样的事情很难排除故障,需要改进。对我来说,以上并不是一个可以接受的整体解决方案。我发现如果 MS 能针对上述问题提供更好的反馈和更详细的信息,那么解决它的方法就会更简单。一个人不应该花几天时间查看日志、在网络上进行研究并测试什么时候像 "This class is unsupported for Shim Generation" 这样的简单消息就足够了。