【问题标题】:How to Mole System.Net.Dns.GetAddrInfo for a wcf client?如何为 wcf 客户端安装 System.Net.Dns.GetAddrInfo?
【发布时间】:2012-02-12 08:53:50
【问题描述】:

我能够 Mole WebRequest.CreateUri 以便我可以将请求的主机名替换为另一个。但是,我想改用 Mole Dns.GetAddrInfo,以便我可以保持主机名相同,但要使主机名解析为另一个 IP 地址。

这样,我不必编辑我的主机文件,因为这是一种不太灵活的方法。

有什么建议吗?

谢谢。

编辑
我已经上传了一个示例 Visual Studio 2010 sln 到问题here

打开sln时,

  1. 单击服务项目属性的 Web 选项卡中的“创建虚拟目录”按钮。
  2. 重建解决方案
  3. 将以下条目添加到c:\windows\system32\drivers\etc\hosts:
    127.0.0.1 www.productionserver.com
  4. Tests 项目中运行TestMethod1 单元测试。
    单元测试应该会成功。
  5. hosts 文件中删除条目并重新运行单元测试。
    它应该会失败。

我使用反编译器查看了System.ServiceModel.ClientBase<TChannel> 的实现,并注意到它最终会调用System.Net.Dns.GetAddrInfo 来将主机名解析为IP 地址。

我希望这个 sln 足够简单,可以更新和发回(或者只是评论需要完成和\或更改的内容),以便我可以简单地了解解决问题所需的内容。

谢谢。

编辑 2
Moles 目前似乎无法做到这一点。

【问题讨论】:

    标签: moles


    【解决方案1】:

    System.Net 堆栈通常不能被篡改,因为他的大部分功能不在托管代码的控制范围内。

    相反,在您的生产代码中创建一个接口和存根。使用带有依赖注入的接口,将存根传递给目标代码。在测试期间,此存根仅调用您希望拦截的 System.Net 方法。

    Moles 会自动从界面生成一个 Stub 类型。只需实例化存根类型,绕过存根所需的方法/属性/事件,然后将存根类型传递给正在测试的方法。

    在无法创建 Mole 类型的地方使用存根和依赖注入。

    【讨论】:

    • 感谢您的快速回复,迈克。我对 Moles 还是新手,所以我可能需要一些时间来尝试实施这个解决方案(并将其标记为答案)。我想知道是否有一个示例解决方案(在单独的项目中包含代码,即测试和生产),您可以指出它做类似的事情,可以帮助我更好地理解和实现我的问题的解决方案,就像我有以前没有使用过 Mole 存根类型。如果没有完整的解决方案,文章\博客也会有所帮助。我也会阅读你博客上的一些帖子。再次感谢!
    • @RamiA 我将用演示代码附加我的答案。我的博客 Moles 部分有一些演示:TheCurlyBrace.blogspot.com/p/…
    • 谢谢你,迈克。我真的找不到一些可以真正用于我的场景的示例代码。我已经用一个示例 sln 更新了我的问题,其中的项目说明了我遇到的问题。任何详细的建议,更具体到 sln 中的项目?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多