【问题标题】:Unit test for web service (Service Reference) - xml deserializationWeb 服务的单元测试(服务参考) - xml 反序列化
【发布时间】:2012-11-24 15:45:20
【问题描述】:

总结

我需要一种将 XML 字符串反序列化为通常由 3rd 方 Web 服务返回的对象的方法。

使用 C#。

详细说明

我有使用第 3 方服务引用(Web 服务)的代码 - 所以通常的东西:我们传入一个 Request 对象,它返回一个 Response 对象。

关于单元测试 - 我对服务参考的内部运作不感兴趣,因为这是第 3 方服务。我只对两件事感兴趣:

  1. 我的代码是否生成了正确的请求对象?
  2. 当服务引用返回它的响应时,我是否正确处理了这个响应?

依次进行:

我的代码是否生成了正确的 Request 对象?

这是我能做到的。如果有人对此感兴趣,我所做的就是用 RhinoMocks Mock 对象替换我的服务引用。在我的单元测试中,我在 Mock 上调用该方法,然后检查传入的参数,将实际的 Request 对象与预期的 Request 对象进行比较。

当服务引用返回它的响应时,我是否正确处理了这个响应?

我在这里要做的是为我的服务引用创建一个 RhinoMocks 存根,这样当它被调用时,这个存根返回一个填充了我的测试数据的响应对象。

我面临的问题是这个特定的 3rd 方服务返回的响应对象非常复杂。如果我试图通过手动硬编码所有属性值来创建一个,那么这可能会花费我一整天的时间。

但是,我可以很容易地从该服务捕获 XML 序列化响应。然后我可以轻松地编辑它的值并将这个 XML 存储在我的一个单元测试中。

我所追求的是一种简单的方法,然后将这个“测试”XML“反序列化”为响应对象,并使用它来对来自我的存根的响应进行编程。

任何帮助将不胜感激。

谢谢

格里夫

【问题讨论】:

    标签: web-services unit-testing c#-4.0 deserialization rhino-mocks


    【解决方案1】:

    原来这很简单:

    public static object Deserialize(string xml, Type toType)
    {
        using(Stream stream = new MemoryStream())
        {
            byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
            stream.Write(data, 0, data.Length);
            stream.Position = 0;
            var s = new XmlSerializer(toType, "http://^your url^");
            return s.Deserialize(stream);
        }
    }
    

    请注意,如果您在 SOAP 请求中使用 XML,请先剥离 SOAP 封装。

    格里夫

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2023-03-11
      • 2011-01-10
      • 2014-07-19
      相关资源
      最近更新 更多