2011-05-24 22 views
4

对于集成测试,我想有一个.save()故意为了测试根据else -condition。如何在集成测试中使域对象的.save()方法失败?

我的测试类做这样的:

从UserService.groovy:

User user = User.findByXyz(xyz) 
if (user) { 
    // foo 
    if (user.save()) { 
     // bar 
    } else { 
     // I WANT TO GET HERE 
    } 
} 

我试过至今未能实现途径:

什么我已经试过在UserServiceTests.groovy中:

def uControl = mockFor(User) 
uControl.demand.save { flush -> null } // in order to test a failing user.save() 
def enabledUser = userService.enableUser(u.confirmationToken) 
uControl.verify() 

// or the following: 
User.metaClass.'static'.save = { flush -> null } // fails *all* other tests too 

如何正确地从集成测试中找到else块?

+0

更改的用户元类应该工作,你只需要首先调用registerMetaClass这样的元级被测试完成后恢复,不要忘记调用super.tearDown()如果你已经在你的类中实现它。 – 2011-09-05 02:10:48

回答

0

,也许你可以尝试改变“验证”别的东西 - 通过使用u必须显示相同的元编程类。 这样,如果验证失败,那么保存肯定会失败

+0

虽然我会建议你的集成测试应该期望只有其中一个字段未通过验证标准(即约束)时save方法才会失败。 – rk2010 2011-05-24 15:24:15

+0

你能详细说明一下吗?我目前不知道尝试更改validate()并尝试更改save() – user569825 2011-05-24 16:42:38

3

在集成测试中,您几乎从不需要嘲笑或更改元类 - 单元测试。

如果你想失败save()调用只是通过在不验证数据。例如,默认情况下所有字段都不为空,因此使用def user = new User()应该失败。

+0

Thanks Burt之间的区别。我已经添加了'User user = User.findByXyz(xyz)'作为第一行,这反映了我目前的情况,并解释了为什么我无法遵循您的建议。我怎么能处理这种情况? – user569825 2011-05-28 10:38:39

0

我做在这种情况下什么: 我总是至少有一个字段是不是空。 我根本就没有设置它,然后调用.save() 如果要在数据库中已经实现这个目标,只需使用找到或得到加载它,并设置不为空值之一为空,然后尝试保存它。 如果您没有将Config.groovy配置为在保存失败时抛出异常,则不会抛出异常,它不会保存它[您可以预先调用.validate()以确定它是否会保存,以及检查object_instance.errors.allErrors列表以查看错误]。

相关问题