从模拟对象列表创建xml时出错

时间:2014-07-01 18:14:35

标签: c# asp.net xml unit-testing serialization

我想生成一个示例xml,所以我编写了一个单元测试,其中我使用moq创建了一个对象。我试着像这样序列化它:

private AssetDescription GetAssetDescription(string description, string type, string name, string iconUrl)
{
        var asstDesp = new Mock<AssetDescription>(type);
        asstDesp.Setup(m => m.Description).Returns(description);
        asstDesp.Setup(m => m.Type).Returns(type);
        asstDesp.Setup(m => m.Name).Returns(name);
        asstDesp.Setup(m => m.IconUrl).Returns(iconUrl);

        return asstDesp.Object;
}

注意:此处AssetDescription是这样的类:

[DataContract]
public class AssetDescription
{
    [DataMember]
    public virtual string Type { get;  set; }

    [DataMember]
    public virtual string Name { get; set; }

    [DataMember]
    public virtual string Description { get; set; }

    [DataMember]
    public virtual string IconUrl { get; set; }

    public AssetDescription(string type)
    {
        Type = type;
    }

    public AssetDescription()
    {
        // I have added a parameter less constructor to xml serialization.
    }
}

XML序列化方法:

 public string SerializeObject(object obj)
 {
        var xmlDoc = new XmlDocument();
        var serializer = new XmlSerializer(obj.GetType());

        using (var ms = new MemoryStream())
        {
            serializer.Serialize(ms, obj);
            ms.Position = 0;
            xmlDoc.Load(ms);
            return xmlDoc.InnerXml;
        }
}

现在我可以像这样成功地序列化AssetDescription

var ds = GetAssetDescription("Description1", "type1", "name1", "iconurl1");
var dsxml = SerializeObject(ds);

问题AssetDescription是列表的一部分,该列表是我使用moq创建该对象的其他对象的一部分。经过一些测试后我对此进行了细分: - 我无法序列化AssetDescription 列表,但是它会抛出错误。

这是我的列表创建方法:

private List<AssetDescription> GetListAssetDescriptions()
{
        var lst = new List<AssetDescription>
        {
            GetAssetDescription("Description1", "type1", "name1", "iconurl1"),
            GetAssetDescription("Description2", "type2", "name2", "iconurl2"),
            GetAssetDescription("Description3", "type3", "name3", "iconurl3"),
            GetAssetDescription("Description4", "type4", "name4", "iconurl4")
        };

        return lst;
}

我试着像这样序列化它:

var fgh = GetListAssetDescriptions();           
var fghd = SerializeObject(fgh);

但发生此错误:

  

生成XML文档时出错

问题:

  1. 我可以从模拟对象生成xml吗?

  2. 如果是,那么有人知道如何解决这个错误吗?

1 个答案:

答案 0 :(得分:1)

不是答案,但我对这个问题感到困惑。我来问你几个问题:

  1. 你为什么需要在那里嘲笑? AssetDescription是POCO,而不是界面。就你的代码而言,这个类没有做任何事情。 为什么你不能只创建一个真实的对象,而不是模拟
  2. 如果你需要在那里进行模拟,那么序列化到xml的目的是什么?你以后怎么办呢?
  3. 模拟仅用于测试。在向非测试项目添加Moq引用之前,必须要认真思考。模拟具有相当复杂的内部结构 - 它们被设计成伪装成它们不是的东西。 XML序列化不是这些人的设计的一部分,所以毫不奇怪你不能将mock序列化为XML。我会走得那么远,说没有解决方法。因为模拟不能被序列化。