Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何在C#中对这些序列化/反序列化方法进行单元测试?_C#_List_Unit Testing_Serialization_Deserialization - Fatal编程技术网

我如何在C#中对这些序列化/反序列化方法进行单元测试?

我如何在C#中对这些序列化/反序列化方法进行单元测试?,c#,list,unit-testing,serialization,deserialization,C#,List,Unit Testing,Serialization,Deserialization,我目前正试图为我的一个项目编写一些单元测试,该项目存储有关健身房训练的详细信息列表,但我不知道如何做,因为单元测试对我来说相当陌生。要序列化的方法是SaveState(),要反序列化的方法是LoadState(),它们在运行时都工作得非常好。谢天谢地,我只需要编写一些单元测试来快速证明这一点。allSessions从中获取的列表(会话)来自另一个保存数据的类,但我不知道在测试时是否确实需要它,或者您是否只是在测试本身中替换了其他内容。任何帮助都是非常感激的 public class Se

我目前正试图为我的一个项目编写一些单元测试,该项目存储有关健身房训练的详细信息列表,但我不知道如何做,因为单元测试对我来说相当陌生。要序列化的方法是SaveState(),要反序列化的方法是LoadState(),它们在运行时都工作得非常好。谢天谢地,我只需要编写一些单元测试来快速证明这一点。allSessions从中获取的列表(会话)来自另一个保存数据的类,但我不知道在测试时是否确实需要它,或者您是否只是在测试本身中替换了其他内容。任何帮助都是非常感激的

    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.
  }
}