我可以从内存中的实例生成代码以便以后重新创建吗?

时间:2016-02-24 09:32:55

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

想象一下,我有一个设置了属性的实例(例如从db加载),

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

VS中是否有任何技巧或我可以使用的任何工具?

由于

1 个答案:

答案 0 :(得分:2)

由于这是您要保存的公共属性,请查看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);    
}

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

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这样的框架可以让你“动态”创建这样的接口,允许你为每个测试方法返回一个特定的硬编码对象。