如何保留内存数据结构以便以后在单元测试中使用它

时间:2009-09-29 07:49:24

标签: c# unit-testing tdd drivers

在我的代码中,我偶尔会传递各种字节数组等。此外,它们可能是托管对象。我想保留这些内存结构,以便我可以根据具体示例编写测试用例。

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

有更简单的方法吗?我无法想象这是新事物。假设你有一个消防中央单位与之交流。您可以使用它来生成数据报,您希望为单元测试创​​建数据报。此外,当您遇到由于某个未记录的方式而导致的错误时,消防中心正在组成其复合消息,您希望记录并保留这些示例。

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

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

尝试使用binary serialization

以上内容专门针对您要保存/加载信息的部分或包含用于测试与外部系统交互的信息的一些对象。我更倾向于将这些测试称为集中测试,以便更好地捕获其他代码的单元测试与您可能拥有的其他逻辑的重点差异。

尝试将与外部系统进行特定集成的代码与系统中的其余代码分开。我建议把它放在一个接口后面,你可以在为系统的其余部分创建单元测试时替换/ mock。通过这种方式,您可以使用专门设计的方案来测试代码的多个方面/逻辑,而无需访问外部系统 - 这也意味着您可以在几秒钟内运行大量代码。

答案 1 :(得分:3)

正如弗雷迪里奥斯在他的回答中暗示的那样,你需要某种方法来持久保存内存中的对象,以便你可以从单元测试中重用它。 Memento design pattern是一个很好的开始,序列化是实现它的默认.NET方式。

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

提取与接口后面的资源之间的通信。这总是一个很好的设计决定。

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

当您进行故障排除时,您可以将代码挂钩到Memento Decorator,然后在他们写入的地方获取文件。对于生产代码,您只需跳过Memento Decorator并直接使用真实的实现。

如果你想要真正的幻想,你甚至可以实现Memento装饰器,以便它发出模仿所记录的交互的单元测试代码,但这可能需要相当多的努力......