0

总之

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

使用 C#。

详细地

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

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

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

依次取每个:

我的代码是否生成正确的请求对象?

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

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

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

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

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

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

任何帮助将非常感激。

谢谢

格里夫

4

1 回答 1

0

事实证明这很简单:

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 信封。

格里夫

于 2012-12-06T17:08:23.330 回答