gpt4 book ai didi

unit-testing - MockDomain 调用提供夹具域数据不起作用,我错过了什么? Grails 2.0.1

转载 作者:行者123 更新时间:2023-12-04 10:55:38 24 4
gpt4 key购买 nike

我正在尝试按照以下文档对 Grails 服务的单元测试中的域类进行一些简单的模拟,但它似乎根本不起作用,因为对实例的查询总是返回 null。我错过了一些简单的东西吗?这是我的代码的相关部分,为了清楚起见,我更改了类和测试方法的名称:

@TestFor(MyService)
@TestMixin(DomainClassUnitTestMixin)

class MyServiceTests {


void testMyThing() {
defineBeans {anotherService(AnotherService)} //My service under test uses another service, unlikely relevant?

MyUser.metaClass.isDirty = { //workaround for mockDomain not adding isDirty method.
println("dirty check called");
}

mockDomain(MyUser, [
[username: "email@gmail.com", accountType: UserType.STANDARD, id: 1L],
[username: "user@gmail.com", accountType: UserType.STANDARD, id:3L],
[username: "bizuser@domain.com", accountType: UserType.BUSINESS, id:2L]
])

MyUser user1 = MyUser.get(1);
System.out.println("user 1: ${user1}"); // output is 'user 1: null'

MyUser user1byName = MyUser.findByUsername("email@gmail.com");
System.out.println("user 1 by name: ${user1byName}"); // output is 'user 1 by name: null'

... the actual testing stuff which would love to have non null MyUser objects ...
}
}

最佳答案

我想通了,你会认为我会想到这一点,因为我以前被它咬过。问题在于验证,如果 Domain 类有验证错误,Grails 的默认 GORM 行为会在 save() 上静默无法持久保存数据(当您为模拟实例传递数据时,mockDomain 必须使用它)。 MyUser 需要一个非空密码。

很久以前我加了grails.gorm.failOnError=true到我的应用程序的 Config.groovy 中,所以我再也不会考虑它了,但当然不会被单元测试读入

在我看来,这使得 mockDomain 的签名非常脆弱(而且我找不到设置 failOnError=true 的方法)。我将模拟数据设置切换为以下内容,其结果完全相同,但如果您的数据设置不正确,则会立即失败。

@Mock(MyUser)
class MyServiceTests {
...

void testMyThing() {
new MyUser(username: "email@gmail.com",
accountType: UserType.STANDARD,
id: 1L).save(failOnError:true) //throws exception because MyUser requires password field to be non blank
...
}
}

关于unit-testing - MockDomain 调用提供夹具域数据不起作用,我错过了什么? Grails 2.0.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9693721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com