【问题标题】:Error in creating xml from an list of mock objects从模拟对象列表创建 xml 时出错
【发布时间】:2014-07-01 18:14:35
【问题描述】:

我想生成一个示例 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. 如果是,那么有人知道如何解决这个错误吗?

【问题讨论】:

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


    【解决方案1】:

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

    1. 为什么需要在那里模拟? AssetDescription 是 POCO,不是接口。就您的代码而言,此类不执行任何操作。 为什么不能只创建一个真实的对象,而不是模拟
    2. 如果你需要mock那里,序列化为xml的目的是什么?以后怎么处理?

    模拟仅用于测试。在将Moq 引用添加到非测试项目之前,必须认真思考。模拟具有相当复杂的内部结构——它们被设计成假装不是它们。 XML 序列化不是这些人设计的一部分,因此您不能将 mock 序列化为 XML 也就不足为奇了。我会说这么多,说没有解决方法。因为不能序列化模拟。

    【讨论】:

    • 我得到了这些 Poco 类,它们的一些属性没有公共设置器,我想使用这些类生成一个示例 xml(AssetsDescription 是类的一部分)。所以我决定模拟它们并制作一个示例 xml。所以我遇到了这个问题。之后,我将他们的属性设置器公开并生成了一个 xml。 xml 的目的:- 我会从我的服务器中获得一个 xml,但现在无法发出请求。非常感谢您的努力。
    • 好吧,你误用了 mocks。模拟不能序列化,仅用于单元测试。您必须想出另一种方法来创建 xml(继承 AssetDescription 和“静音”有问题的函数??)
    猜你喜欢
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多