想象一下,我有一个设置了属性的实例(例如从db加载),
并且从内存中的这个实例中,我想获得一个代码,其中包含在当前值上设置的所有公共属性,以便我可以在单元测试中使用它来重新创建实例。
VS中是否有任何技巧或我可以使用的任何工具?
由于
答案 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这样的框架可以让你“动态”创建这样的接口,允许你为每个测试方法返回一个特定的硬编码对象。