2013-07-15 132 views
3

我不知道是否使用单元或集成测试来测试我想在我的Grails 2.2.3应用程序中测试的内容。我想对此进行一些测试:Grails单元或集成测试?

@TestFor(Student) 
@Mock(Student) 
class StudentTests { 

void testFoundStudent() { 
     def s = Student.findById(myId) 
     assert s != null 
     assert s.firstName = 'Grant' 
     assert s.lastName = 'McConnaughey' 
    } 
} 

这将要求使用我们的测试数据库,那么这会使它成为一个集成测试吗?当我作为一个单元测试运行这个代码时,它在assert s != null失败。这意味着它没有使用我们的数据库,因为它应该找到具有该ID的学生。

+0

您的测试数据库是否在'test'环境下'DataSource.groovy'中提及/使用过? – dmahapatro

+1

加我认为你不需要'@ Mock'注释如果你正在使用'@TestFor(DomainClass)'。 '@ TestFor'会为你嘲笑。 – dmahapatro

+0

你能解决你的问题吗? – Alidad

回答

5

在Grails单元测试中,您可以使用Gorm和场景后面测试域类交互。Grails将使用内存数据库(ConcurrentHashMap的实现)来模拟此行为here。所以是的,你会得到null,因为这个学生不存在于内存数据库中,你需要先插入这些数据。

Student.findOrSaveWhere (firstName: 'Grant',lastName : 'McConnaughey') 

在你的榜样,如果目的是测试你需要使用集成测试,并将其连接到使用datasource.groovy你的数据库,这实在不是一个好主意,除非你有一个很好的理由,数据的存在测试你的数据。

如果您试图再次测试def s = Student.findById(myId),因为这是Grails动态查找程序,因此您可能需要信任您正在使用的框架。

然而,一般

单元测试通常没有物理 资源涉及I/O这样的数据库,套接字连接或 文件link

我希望这有助于存在运行

+1

对不起。公认。 – grantmcconnaughey

+0

那么应用程序可能只需要集成测试? –

+0

我会说任何应用程序都应该至少有单元,集成和功能测试。我宁愿有重叠覆盖而不覆盖某些东西。您选择了测试,具体取决于您正在测试的模块的性质。简单而天真的答案,是通过单元测试覆盖单个功能的小型组件。然后使用集成测试来覆盖它们的交互,并最终用于覆盖更大的图片。我的类比是放大并用单元测试来测试问题,然后缩小一点并用集成进行测试,并完全缩小功能测试的问题。 – Alidad