5

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

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

有没有更简单的方法?我无法想象这是新事物。假设您有一个消防中央单元与之通信。你玩弄它,让它生成它的数据报,你想为你的单元测试创​​建这些数据报。此外,当您遇到由于 Fire Central 编写其复合消息的某种未记录方式而导致的错误时,您希望记录并保留这些示例。

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

有什么建议么?

4

2 回答 2

4

尝试二进制序列化

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

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

于 2009-09-29T07:59:25.177 回答
3

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

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

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

当您这样做时,您可以使用装饰器设计模式来包装该接口的实际实现。这意味着您可以创建一个简单地记录(序列化)交互的装饰器,但在记录相关对象后将所有调用委托给底层实现。

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

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

于 2009-09-29T08:14:13.993 回答