【问题标题】:Shims are not generated for .NET methods不会为 .NET 方法生成垫片
【发布时间】:2013-04-15 18:32:16
【问题描述】:

当我开始使用 Microsoft Fakes 时,我很高兴开始对一些 .NET 方法进行填充。我被引导相信我能够填充任何 .NET 方法,无论是否静态:http://msdn.microsoft.com/en-us/library/hh549176.aspx

但是,我一直在尝试填充 TcpClient 中的一些方法并且只创建存根,这对我没有好处,因为我希望能够更改一些方法以返回我自己的数据而不是依赖在实时 TcpClient 上给我数据。

如果除了 Microsoft Fakes 之外还有其他方法,我愿意接受有关如何执行此操作的任何建议。

编辑:添加代码来演示问题

[TestMethod]
public void CommunicationTest()
{
    var stubbedTcpClient = new System.Net.Sockets.Fakes.StubTcpClient
    {

    };

    //No such ShimTcpClient exists
    var shimmedTcpClient = new System.Net.Sockets.Fakes.ShimTcpClient
    {

    };
}

【问题讨论】:

  • 你能分享你的代码吗?或者至少足以证明问题?
  • 我添加了我希望生成的 TcpClient shim 代码
  • 你想用什么方法来填充?如果它是虚拟的,你可以使用NSubstitute,如果不是,你会被Fakes 卡住。
  • Available 和 Connected 属性以及 GetStream。我会给 NSubstitute 一个机会,看看会发生什么。我仍然想得到一个充分的理由,说明为什么我似乎无法让任何 .NET 类生成除 DateTime 之外的 shim 版本。
  • 如果方法不是虚拟的或接口(GetStream() 两者都不是),您将无法使用 NSubstitute。

标签: c# .net moles microsoft-fakes


【解决方案1】:

this blog posthere 的帮助下成功了。

解决方案是在 System.fakes 文件中明确添加我想要填充的类。这是我现在的样子:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
  <Assembly Name="System" Version="4.0.0.0"/>
  <ShimGeneration>
    <Clear/>
    <Add FullName="System.Net.Sockets.TcpClient"/>
    <Remove Obsolete="1"/>
  </ShimGeneration>
</Fakes>

Remove Obsolete="1" 用于阻止 Shim 生成代码在尝试填充 [Obsolete] 代码时引发错误。

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。

    我的 System.fakes 和 mscorlib.fakes 看起来像这样:

    <Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
      <Assembly Name="mscorlib" Version="4.0.0.0"/>
      <ShimGeneration>
        <Add Namespace="System.ComponentModel.BackgroundWorker"/>
      </ShimGeneration>
    </Fakes>
    

    <Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
      <Assembly Name="System" Version="4.0.0.0"/>
      <ShimGeneration>
        <Add Namespace="System.ComponentModel.BackgroundWorker"/>
      </ShimGeneration>
    </Fakes>
    

    解决方案

    System.fakes

     <Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
       <Assembly Name="System" Version="4.0.0.0"/>
       <ShimGeneration>
         <Add FullName="System.ComponentModel.BackgroundWorker!"/>
       </ShimGeneration>
     </Fakes>
    

    mscorlib.fakes

    <Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
      <Assembly Name="mscorlib" Version="4.0.0.0"/>
      <ShimGeneration>
        <Add FullName="System.ComponentModel.BackgroundWorker!"/>
      </ShimGeneration>
    </Fakes>
    

    保存文件后,我重建解决方案。现在我有了 ShimBackgroundWorker。

    【讨论】:

    • 我正在使用 VS.Net Ultimate 2012
    • 我更改了如下文件,现在我有了 ShimBackgroundWorker
    • 重要说明:“FullName 末尾的感叹号是可选的。没有它,Fakes 代码生成器将考虑所有以指定字符串开头的类型。感叹号告诉代码生成器查看进行精确匹配。” Source
    • 这对我们使用 System.Net.WebClient 有效,记得重建解决方案!
    猜你喜欢
    • 2015-07-13
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多