对于集成测试,我希望有意.save()
来测试相应的else
条件。
我正在测试的课程是这样做的:
来自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 :(得分:3)
在集成测试中,您几乎从不需要模拟或更改元类 - 仅进行单元测试。
如果您希望失败,save()
调用只会传入未验证的数据。例如,默认情况下所有字段都不为null,因此使用def user = new User()
会失败。
答案 1 :(得分:0)
也许您可以尝试将'validate'更改为其他内容 - 使用您已显示的相同元类编程。 这样,如果验证失败,则保存肯定会失败
答案 2 :(得分:0)
在这种情况下我做了什么: 我总是至少有一个非空的字段。 我只是不设置它然后调用.save() 如果要在数据库中已有的对象上实现此目的,只需使用find或get加载它,并将其中一个非空值设置为null,然后尝试保存它。 如果你没有配置Config.groovy配置为在保存失败时抛出异常将不会抛出异常,它就不会保存它[你可以提前调用.validate()来确定它是否会保存并检查object_instance.errors.allErrors列表以查看错误]。