我如何在C#中对这些序列化/反序列化方法进行单元测试?
我目前正试图为我的一个项目编写一些单元测试,该项目存储有关健身房训练的详细信息列表,但我不知道如何做,因为单元测试对我来说相当陌生。要序列化的方法是SaveState(),要反序列化的方法是LoadState(),它们在运行时都工作得非常好。谢天谢地,我只需要编写一些单元测试来快速证明这一点。allSessions从中获取的列表(会话)来自另一个保存数据的类,但我不知道在测试时是否确实需要它,或者您是否只是在测试本身中替换了其他内容。任何帮助都是非常感激的我如何在C#中对这些序列化/反序列化方法进行单元测试?,c#,list,unit-testing,serialization,deserialization,C#,List,Unit Testing,Serialization,Deserialization,我目前正试图为我的一个项目编写一些单元测试,该项目存储有关健身房训练的详细信息列表,但我不知道如何做,因为单元测试对我来说相当陌生。要序列化的方法是SaveState(),要反序列化的方法是LoadState(),它们在运行时都工作得非常好。谢天谢地,我只需要编写一些单元测试来快速证明这一点。allSessions从中获取的列表(会话)来自另一个保存数据的类,但我不知道在测试时是否确实需要它,或者您是否只是在测试本身中替换了其他内容。任何帮助都是非常感激的 public class Se
public class SessionsManager
{
const string FILENAME = "SessionFile.dat";
//declare private list for events
private List<Session> allSessions;
// Public Property
public List<Session> AllSessions { get => allSessions; set => allSessions = value; }
//creating constructor to hold lists
public SessionsManager()
{
AllSessions = new List<Session>();
}
public void SaveState()
{
//Formatter object
BinaryFormatter biFormatter = new BinaryFormatter();
//stream object to create file types
FileStream outFile = new FileStream(FILENAME, FileMode.Create, FileAccess.Write);
//Save the whole list in one
biFormatter.Serialize(outFile, allSessions);
//Close the stream, dont want them crossing after all
outFile.Close();
}
public void LoadState()
{
//Formatter object
BinaryFormatter biiFormatter = new BinaryFormatter();
//stream object to read file
FileStream InFile = new FileStream(FILENAME, FileMode.Open, FileAccess.Read);
//Deserialise the whole list
allSessions = ((List<Session>)biiFormatter.Deserialize(InFile));
//close stream
InFile.Close();
}
}
公共类会话管理器
{
常量字符串FILENAME=“SessionFile.dat”;
//为事件声明私有列表
所有会议的非公开名单;
//公共财产
public List AllSessions{get=>AllSessions;set=>AllSessions=value;}
//创建用于保存列表的构造函数
公共会话管理器()
{
AllSessions=新列表();
}
public void SaveState()
{
//格式化程序对象
BinaryFormatter biFormatter=新的BinaryFormatter();
//创建文件类型的流对象
FileStream outFile=newfilestream(文件名,FileMode.Create,FileAccess.Write);
//将整个列表保存在一个文件夹中
序列化(输出文件,所有会话);
//关上小溪,别让他们穿过
outFile.Close();
}
public void LoadState()
{
//格式化程序对象
BinaryFormatter biiFormatter=新的BinaryFormatter();
//要读取文件的流对象
FileStream InFile=新FileStream(文件名,FileMode.Open,FileAccess.Read);
//反序列化整个列表
allSessions=((列表)biiFormatter.Deserialize(infle));
//密流
infle.Close();
}
}
单元测试实际上显示了可以以更智能的方式设计的部分代码
我希望您建议重构sessionmanager
类,并添加新方法,将序列化添加到流(输入参数)中,如
单元测试的方法是对文件流使用依赖性注入并模拟它。然而,我会质疑这样的测试会带来多大的价值。它主要是关于测试标准库的,而且这些测试已经存在。虽然TDD本身是一个单独的主题,也是一个偏好问题,但这是TDD帮助主题类设计的地方,可以识别依赖项并测试所需的行为。谢谢,这是一个很大的帮助。我将尝试让它工作。TestSerialize()方法不工作,它说SaveState()中没有与“value”相对应的参数@Anthony看起来我忘记放置流参数了。请再试一次。我已经更新了答案
public static T LoadState<T>(Stream stream)
{
BinaryFormatter biiFormatter = new BinaryFormatter();
return (T)biiFormatter.Deserialize(stream);
}
public static void SaveState<T>(Stream stream, T value)
{
BinaryFormatter biFormatter = new BinaryFormatter();
biFormatter.Serialize(outFile, value);
}
public void TestSerialize()
{
using (var ms = new MemoryStream())
{
SessionsManager.SaveState(ms, new List<Session>() { new Session() } );
ms.Position = 0;
var res = SessionManager.LoadState<List<Session>>(ms);
Assert.AreEqual(1, res.Count); // check that there are the same count of elements e.g.
}
}