2009-02-27 19 views
13

我认为我自己对于TDD场景还很新。但是发现无论我使用哪种方法(模拟框架或存根自己的对象),我发现我必须编写大量代码才能创建模拟数据。我喜欢加载对象来创建内存数据库的想法。但是我不喜欢的是,为了创建模拟数据的唯一目的,使用大量的代码来混淆我的测试。当数据需要考虑所有不同情况时尤其如此。为单元测试创​​建模拟数据

我很乐意提供一些更好的方法。

在我看来,我应该能够从一些数据存储中将数据加载到一个已知状态,然后我可以使用每个测试方法之前在测试设置/初始化中加载的状态快照被执行。这将满足正确的测试实践,同时提供便利,让我专注于编写测试,而不是编写代码来“手动”创建测试数据。

回答

6

可能你可以试试NBuilder库。它提供了一个非常流畅的界面,易于使用。您可以使用它来生成具有默认值的类的单个实例,或使用默认值或重写值生成列表。你可以看看this之一。

0

我确切地知道你的意思。我认为解决这个问题的一个好方法是实际上有一个单独的MockFramework项目,它包含测试项目之外的所有模拟数据。这样,您可以分别生成模拟数据,如果需要,也可以将其存储在内存中,然后从测试项目中引用模拟框架。如果你使用第三方框架来做到这一点,那就更好了,但是你仍然可以将第三方框架包装在你自己的模拟框架中,这样你就可以得到所有“胶水”,以你需要的方式创建模拟数据你的测试可以使测试真正成为他们需要的东西。

+0

这解决了杂乱的问题,但我仍然需要模拟所有数据,只需在一个单独的项目中。也许,正如你所建议的那样,我可以使用第三方框架加载数据并将其转换为我的对象模型。根据webjedi的建议,nDbUnit可以工作。 – 2009-02-27 19:27:10

1

您可以使用Builder类来帮助您构建所需的实例/在这种情况下,您将使用与存储库相关的实例。 让Builder使用适当的默认值,并且在测试中,您可以覆盖所需的内容。这有助于避免将所有不同测试混淆的每一个“数据”情况(引入问题,因为通常情况下,不同测试不兼容的情况)。

**更新1:**看看www.markhneedham.com/blog/2009/01/21/c-builder-pattern-still-useful-for-test-data

+0

感谢您的链接,这有助于我更好地了解您的意思。这仍然需要我手动编写对象,方法不同。不过,你不应该把每一个案例都放入“数据”中。 – 2009-02-27 19:15:26

+0

请注意,拥有默认设置的目的是为了让您拥有共享的配置/数据,但不会在特定情况下漏掉所有配置/数据。 – eglasius 2009-02-28 06:59:13

1

如果您使用的是.NET尝试NDBUnit

您填写您的商店,然后在测试时间恢复您的数据库到已知状态,为每个测试。 Autumn of Agile屏幕播放系列以相当好的细节显示了这一点。

或者您可以手动执行此操作...构建一个存储过程或任何可以截断您的表并在您的拆卸方法中复制数据的方法。

+0

这只适用于集成测试。 – eglasius 2009-02-27 18:30:42

+0

弗雷迪里奥斯对你的第二条评论是正确的。 nDbUnit接近,但我似乎无法找到任何文档。我从“秋天的敏捷”下载了代码示例,看起来我需要一个xsd,而且我已经在使用实体框架,所以我必须将所有内容从xsd复制到EF。 – 2009-02-27 19:19:45

0

感谢所有的建议,我认为解决方案需要一点点的一切。我不希望这些测试最终成为回归测试,但没有某种现有数据存储,所有东西都归结为通过“手动”构建对象来创建数据。

真的很好会是一个框架,它允许我使用现有的DAL编写脚本来为我编写数据或者获取内存中的数据,并像访问内存数据库一样访问它。

0

Untils.org覆盖这种方式比我所能做的更好。

他们的整个指南其实很好。

但基本上,如果你的单位需要“大量的数据”,他们可能不再是单元测试。我建议尝试单独测试小块。

相关问题