2011-05-10 28 views
1

对于一个项目,我有一系列创建XML伪库的(它们不是真正的仓库,但填补了同样的作用,所以我再也忍受不了了命名)通过调用一些返回的XML存储的特效。为了我的项目,我还有“映射器”(它们不是true映射器......)将XML作为输入并使用Linq将原始XML转换为DTO。我应该如何测试返回XML的“存储库”?

由于我有映射器,在我看来,“存储库”不应该测试返回的值(因为这是映射器的工作;存储库只关心它返回了一些XML,无论是否XML数据是正确的)。但是,这会导致测试从字面上确保“存储库”的返回值不为null。

基本上每一个仓库实现了一种称为GetXml一个方法,它返回一个XML文档的接口。实际的实现是数据库调用,但为了测试,我有一个非常基本的模拟类,它只返回一个空白的XML文档。最终,我需要使用一些硬编码的值来构建一个实际的XML文件,但是这个“确定”的版本库测试基本上是单行的:Assert.IsNotNull(repository.GetXml(), "Xml response was null");

这是甚至应该测试的东西,还是有没有更好的方法来测试这个没有踩在映射器的脚趾?我想从设计的角度来看,我可以完全移除映射器,只需让存储库自己完成映射(或者使映射器在存储库内部)。我没有做TDD,因为我实际上已经编写了代码,但是我想创建测试,因此测试更容易,所以我可以向我的同事展示测试的好处(我们目前不使用类型的自动化测试)。

我想我要问的是这样的:它是好写一个测试,只有表达了有意设计的人谁可以使用代码,而无需实际关心的返回值?眼下这就是这些测试做的:他们说,在代码中,“我应该能够创建一个XmlXXXRepository类,实现了一个名为IXmlRepository的接口,需要较长呼吁建设quoteID,并有一个名为GetXml()方法返回一个XmlDocument对象“就是这样。

回答

3

我通常为我的XML方法编写两种类型的测试。首先,我编写与创建XML结果有关的逻辑的单元测试。这通常会迫使您将您的逻辑提取到另一个类中,以便将逻辑和XML创建分开。这通常意味着逻辑最终会填充一个DTO,并且使用某种构建器类或简单的XML序列化器来从产生的DTO创建XML。

一旦单元测试所有的工作,我开始与一组已知的输入和著名的XML输出创建集成测试。根据XML结果,这可以是非常简单的文本比较,也可以是一系列XPath查询来验证XML中的结构和值。

哦,在MbUnit的的XML assertions都有不俗的表现进行这种测试。