我正在将Grails2中的一系列单元测试升级到Grails3,并且在使用GORM动态方法的域测试中遇到了问题--特别是addTo{myHasMany}方法。
给定以下域对象
class Contact {
static hasMany = [ emails: ContactEmail ]
void addEmail(ContactEmail newEmail) {
//Clear the existing primary flag if the new email is marked primary
if (newEmail.primaryEmail == true) {
for (ContactEmail contactEmail in this.emails) {
if (contactEmail.primaryEmail == true) {
contactEmail.primaryEmail = false
}
}
}
//Implicitly set the primary flag on the new email if it is the first in the list
if ((this.emails == null) || (this.emails.size() == 0)) {
newEmail.primaryEmail = true
}
//Add the email to the contact
this.addToEmails(newEmail)
}
}
class ContactEmail {
String email
Boolean primaryEmail
static belongsTo = [ contact: Contact ]
}
@TestMixin(DomainClassUnitTestMixin)
@TestFor(Contact)
class ContactSpec {
def setup() {
}
def cleanup() {
}
@Unroll
void "test Contact addEmail()"() {
when:
Contact contact = new Contact()
ContactEmail contactEmail = new ContactEmail(email: "test@spiekerpoint.com", primaryEmail: false)
contact.addEmail(contactEmail)
then:
/* DOC - The add email without any other emails should implicitly set the primary email */
contact.primaryEmail.toString() == "test@spiekerpoint.com"
}
}
>
我尝试使用DomainClassUnitTestMixin和mockDomain()方法模拟Contact实例,以生成带有GORM方法(或子集)的实例。
我已经尝试了使用基于Spock交互的测试支持的方法。
事实上,我已经尝试了几乎所有我能想到的组合来让这个工作没有任何运气。我重读了最新Grails规范中的测试部分。
在这里有什么方法可以让它保持一个单元测试吗?
我没有看到newemail
在方法中的任何位置被初始化。因此,addtoEmails()
失败,因为传递的参数为null
。我认为您希望您的方法声明如下。
void addEmail(ContactEmail newEmail) {
//Clear the existing primary flag if the new email is marked primary
if (newEmail.primaryEmail == true) {
for (ContactEmail contactEmail in this.emails) {
if (contactEmail.primaryEmail == true) {
contactEmail.primaryEmail = false
}
}
}
//Implicitly set the primary flag on the new email if it is the first in the list
if ((this.emails == null) || (this.emails.size() == 0)) {
newEmail.primaryEmail = true
}
//Add the email to the contact
this.addToEmails(newEmail)
}
我正在将Grails2中的一系列单元测试升级到Grails3,并在使用Spock数据驱动测试格式驱动测试的域测试中遇到问题。 当我执行测试时,因为测试执行没有填充测试中的错误、字段和val引用。如前所述,这个测试适用于Grails2.5.5,所以我怀疑我缺少了Grails3中需要的一些东西。 Edited:我删除了原来在setup()中的mockForConstraints()调用,使其无效。
问题内容: 我有以前具有大量方法的类,因此我将此方法的工作细分为“辅助”方法。 这些辅助方法声明为强制执行封装- 但是我想对大型公共方法进行单元测试。是否也可以对辅助方法进行单元测试,好象其中的一个失败,而调用它的公共方法也会失败,这样我们就可以确定为什么失败了? 另外,为了使用模拟对象测试这些对象,我需要将其可见性从私有更改为受保护,这是否可取? 问题答案: 一种方法是省略测试并将其放在同一程序
测试失败,因为为。为什么不以阻塞的方式在ViewModel中运行块? 我知道,如果将其转换为返回对象的方法,则可以通过调用获取对象,或者可以返回并调用。但是,我想通过将我的ViewModel方法保留为函数来实现这一点,有没有办法做到这一点呢?
我在单元测试中使用了Moq框架。这是UpdateApplication测试方法: 我在运行测试时遇到一个异常: 我应该如何编写使用Moq更新和删除操作的单元测试?
有人可以告诉我我应该如何测试这两种方法吗: 问题是,我正在使用当前登录的用户进行基本身份验证,但不知道如何进行,也不知道我是否可以模仿这些主体。有办法做到这一点吗?那些方法在我的服务层中,所以也许我不能做单元测试,我只能做集成测试,因为那些方法大量使用DB? 编辑1:我更改的测试类: 我现在得到这些错误: 米辛 编辑2:这是我的UserServiceBean类: } 这是我的用户存储库: 编辑6:
测试方法: 测试用例: