C# 如何保存内存中的数据结构,以便以后在单元测试中使用

C# 如何保存内存中的数据结构,以便以后在单元测试中使用,c#,unit-testing,tdd,drivers,C#,Unit Testing,Tdd,Drivers,在我的代码中,我偶尔会收到各种字节数组之类的消息。此外,它们可能是托管对象。我想保留这些内存结构,这样我就可以针对具体的例子编写测试用例 我的标准方法是点击断点,使用调试器查找各种值,然后重新创建它们,或者在单元测试程序集中嵌入一个文件或其他内容作为资源。 有时,这涉及到编写我自己的组件交互抽象,使我的代码依赖于可以更新的东西 有没有更简单的方法?我无法想象这是什么新鲜事。假设你有一个消防中心单元可以与之通信。您可以使用它来生成数据报,您希望为单元测试创建数据报。此外,当您由于fire cent

在我的代码中,我偶尔会收到各种字节数组之类的消息。此外,它们可能是托管对象。我想保留这些内存结构,这样我就可以针对具体的例子编写测试用例

我的标准方法是点击断点,使用调试器查找各种值,然后重新创建它们,或者在单元测试程序集中嵌入一个文件或其他内容作为资源。 有时,这涉及到编写我自己的组件交互抽象,使我的代码依赖于可以更新的东西

有没有更简单的方法?我无法想象这是什么新鲜事。假设你有一个消防中心单元可以与之通信。您可以使用它来生成数据报,您希望为单元测试创建数据报。此外,当您由于fire central编写其复合消息的某种未记录方式而遇到错误时,您希望记录并保留这些示例

理想情况下,我希望能够将所有交互记录到我的代码中,然后选择各种播放场景。但是,只要从调试器中获取内存中的各种数据报示例并将其放回单元测试中,就会对我有很大帮助

有什么建议吗?

试试看

以上内容专门针对您希望保存/加载信息的部分,或用于测试与该外部系统交互的某些包含信息的对象。我更喜欢将这些测试称为以测试为中心的集成测试,以便更好地捕获与其他逻辑代码的单元测试的焦点差异


尝试将与外部系统进行特定集成的代码与系统中的其他代码分开。我建议将它放在一个接口后面,在为系统的其余部分创建单元测试时,可以替换/模拟接口。通过这种方式,您可以有专门设计的场景,在不影响外部系统的情况下测试代码的多个方面/逻辑,这也意味着您可以在几秒钟内运行大量场景

正如Freddy Rios在回答中所暗示的那样,您需要某种方法来持久化内存中的对象,以便可以从单元测试中重用它。这是一个良好的开端,序列化是实现它的默认.NET方式

这就留下了如何轻松捕获这些对象的问题。以下是一种您可以尝试的方法:

抽象接口后面与资源之间的通信。这总是一个好的设计决策

当您这样做时,您可以使用来包装该接口的实际实现。这意味着您可以创建一个Decorator,该Decorator只记录(序列化)交互,但在底层实现记录了相关对象之后,将所有调用委托给它

当您进行故障排除时,您可以将代码连接到Memento Decorator,然后在编写文件的地方提取文件。对于生产代码,只需跳过Memento装饰器,直接使用真正的实现


如果你真的想做得漂亮,你甚至可以实现Memento Decorator,这样它就可以发出单元测试代码来模拟记录的交互,但这可能需要相当多的努力…

+1这是一个不错的建议,但它确实要求有问题的类型是serializable@MarkY这对于他谈到保存/加载他与外部系统交换的请求/响应的部分来说意义更大——所以我想到的是简单的对象。我不建议用同样的方法进行其余的测试。我不允许通信细节在服务层中显示出来。我有处理通信细节的特定业务实体(类库),这些是它们的测试。在通信和业务逻辑之间有一个抽象层。谢谢。装饰师的想法可能有一些优点。虽然我不确定装饰师是否能够获得必要的知识来辨别交流的斑点是否有趣。但这可能是确保原始数据报作为错误消息负载的一部分完好无损的好方法。通过配置来启用/禁用它会很简单。谢谢。@Tormod:关于评估这个斑点是否有趣的问题,你是对的。您可以简单地记录所有内容,然后根据某种过期策略删除内容,或者您需要实现某种启发式来确定是否记录。因为我不知道您的环境的细节,所以我没有一个特定的解决方案。