gpt4 book ai didi

grails - 如何使用 spock 在 Grails 应用程序中测试具有真实事务的服务?

转载 作者:行者123 更新时间:2023-11-28 21:29:46 24 4
gpt4 key购买 nike

我正在使用 Grails 2.4.4 并想在我的项目中应用 spock 测试。

下面是成员(member)服务:

@Transactional
class MemberService {

def lastMember = null

def login (userId, password) {

def member = Member.findByLoginEmail(userId)
if(!member) return LoginResult.NO_SUCH_MEMBER
if (member.isLocked) return LoginResult.MEMBER_IS_LOCKED

log.debug("member.password is [${member.passwd}], input password is [${password}]")

if (!member.passwd.equals(password)) return LoginResult.PASSWORD_ERROR

switch(member.validateResult) {
case "FAILED":
return LoginResult.VAILDATE_FAILED
case "WAIT":
return LoginResult.WAIT_VALIDATE
}

member.lasLoginTime = new Timestamp(System.currentTimeMillis())
member.lastLoginPlatform = "WEB"
member.loginFailCount = 0
member.save()
lastMember = member
return LoginResult.SUCCESS
}

enum LoginResult {
SUCCESS,
NO_SUCH_MEMBER,
PASSWORD_ERROR,
MEMBER_IS_LOCKED,
VAILDATE_FAILED,
WAIT_VALIDATE
}

enum ValidateResult {
SUCCESS,
FAILED,
WAIT
}
}

MemberServiceSpec如下:

@TestFor(MemberService)
@Mock(Member)
class MemberServiceSpec extends Specification {
def memberService

def setup() {
memberService = new MemberService()
}

void "test something"() {

when:
println "service is ${service}"
def result = memberService.login("aa@mymail.com", "123456")
println "result is ${result}"
then:
result == MemberService.LoginResult.SUCCESS
}
}

测试结果如下:

Testing started at 15:15 ...
|Loading Grails 2.4.4
|Configuring classpath
.
|Environment set to test
....................................
|Running without daemon...
..........................................
|Compiling 1 source files
.
|Running 2 unit tests...|Running 2 unit tests... 1 of 2
--Output from test something--
1. setup
service is cusine_market.MemberService@54c425b1
Enter MemberService.login----------------userId=[aa@mymail.com]
result is NO_SUCH_MEMBER
Failure: |
test something(cusine_market.MemberServiceSpec)
|
Condition not satisfied:
result == MemberService.LoginResult.SUCCESS
| |
| false
NO_SUCH_MEMBER
at cusine_market.MemberServiceSpec.test something(MemberServiceSpec.groovy:32)
Condition not satisfied:

result == MemberService.LoginResult.SUCCESS
| |
| false
NO_SUCH_MEMBER

Condition not satisfied:

result == MemberService.LoginResult.SUCCESS
| |
| false
NO_SUCH_MEMBER

at cusine_market.MemberServiceSpec.test something(MemberServiceSpec.groovy:32)

|Completed 1 unit test, 1 failed in 0m 6s
.Tests FAILED

我确认该用户存在于数据库中。

谁能告诉我为什么 MemberService 在数据库中找不到用户“aa@mymail.com”?我也尝试了下面的行

    memberService = Mock(MemberService);

结果是一样的。但是,如果我运行应用程序,该服务会找到用户。

最佳答案

模拟

在您的测试中,您正在测试 MemberService,这意味着您不需要模拟它。只需通过 service 引用即可。

测试数据

这看起来像单元测试,而不是集成测试。所以它根本不使用您的数据库。

您需要做的是在测试中手动创建Member 实例。你在你的 @Mock 注释中有它,这很好。

现在,创建对象,最好在 given block 中:

void "test something"() {
given:
new Member(loginEmail: 'aa@mymail.com', password: '123456', ...).save(failOnError: true, flush: true)

when:
println "service is ${service}"
def result = service.login("aa@mymail.com", "123456")
println "result is ${result}"
then:
result == MemberService.LoginResult.SUCCESS
}

我添加了 failOnError: true 以确保对象已实际创建。您 - 当然 - 需要在 Member 构造函数中提供所有必需的属性,并确保您提供的数据与您提供给 login 方法的数据相对应。

此外,您需要确保 Member 对象的初始化方式能够满足您要到达的路径。比如要达到LoginResult.SUCCES状态,需要将member.isLocked设置为false等。

奖金

当你让这个测试工作时,你可能想看看 Build Test Data Plugin 。它使创建测试数据(例如您的 Member 对象)变得容易得多。

关于grails - 如何使用 spock 在 Grails 应用程序中测试具有真实事务的服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27056159/

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