【问题标题】:Can I generate a code from an instance in the memory to re-create it later?我可以从内存中的实例生成代码以便稍后重新创建它吗?
【发布时间】:2016-02-24 09:32:55
【问题描述】:

假设我有一个实例,它的属性集(例如从数据库加载),

从内存中的这个实例中,我想获得一个代码,其中所有公共属性都设置在当前值上,这样我就可以在我的单元测试中使用它来重新创建实例。

VS中有什么技巧或者我可以使用的任何工具吗?

谢谢

【问题讨论】:

  • 为什么不在测试开始时读取实体并使用它?如果它在您的数据库中序列化,只需反序列化并使用它。还是我弄错了?
  • 您可以将您的实例序列化为 JSON 或 XML 表示形式,以便将其存储以备将来使用 - 不过,我对您的问题的真实含义感到有些困惑。

标签: c# .net visual-studio unit-testing visual-studio-2012


【解决方案1】:

既然是您要保存的公共属性,请查看Serialization。它允许您将对象流式传输为二进制格式或 XML,并在以后检索它。该流可以是内存流或文件,具体取决于您希望保存多长时间。以下是该 MSDN 页面中的代码,展示了如何将对象保存到 XML 文件并稍后读回:

public class Book
{
    public String title;
}       

public static void WriteXML()       
{
    // First write something so that there is something to read ...
    var b = new Book { title = "Serialization Overview" };
    var writer = new System.Xml.Serialization.XmlSerializer(typeof(Book));
    var wfile = new System.IO.StreamWriter(@"c:\temp\SerializationOverview.xml");
    writer.Serialize(wfile, b);
    wfile.Close();
}

public void ReadXML()
    // Now we can read the serialized book ...
    System.Xml.Serialization.XmlSerializer reader = 
        new System.Xml.Serialization.XmlSerializer(typeof(Book));
    System.IO.StreamReader file = new System.IO.StreamReader(
        @"c:\temp\SerializationOverview.xml");
    Book overview =  (Book)reader.Deserialize(file);
    file.Close();

    Console.WriteLine(overview.title);    
}

也就是说,如果您想使用序列化在单元测试中重新创建对象,我不确定它是否是最佳选择。通常,您会创建一个单独的(可能在内存中)数据库,或者模拟数据库接口以返回硬编码对象。例如,假设您有以下生产代码:

public interface IDataAccess {
   User GetUserById(int userId);
}

public class SqlServerDataAccess : IDataAccess { 
   public User GetUserById(int userId) {
     // ... connect to database and retrieve user
   }
}

然后你可以为你的单元测试写一个实现

public class MockDataAccess : IDataAccess { 
   public User GetUserById(int userId) {
     return new User() { 
       Name = "pencilCake", ...
     }
   }
}

并将其用于您的单元测试。甚至还有像 Moq 和 Rhino 这样的框架可以让你“即时”创建这样的接口,让你为每个测试方法返回一个特定的硬编码对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2022-08-17
    • 2014-01-03
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多