Spock 未找到线程绑定请求
Spock No thread-bound request found
我创建了一个简单的实用程序 class UtilService.groovy 并且当我尝试 运行 为它编写测试用例时。
class UtilService {
static transactional = true
def messageSource
HttpServletRequest getCurrentRequest() {
GrailsWebRequest webUtils = WebUtils.retrieveGrailsWebRequest()
def request = webUtils.getCurrentRequest()
return request
}
String getMessage(String code, Object[] args = null, String defaultMessage = null) {
HttpServletRequest request = currentRequest
Locale locale = request.locale
if (defaultMessage) {
return messageSource.getMessage(code, args, defaultMessage, locale)
} else {
return messageSource.getMessage(code, args, locale)
}
}
测试用例
@TestMixin(GrailsUnitTestMixin)
class UtilServiceSpec extends Specification {
void "Test get message"() {
setup:
def utilService = new UtilService()
when:
String data = utilService.getMessage("payCode.label")
then:
data == "Pay Code"
}
}
错误:
No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread?
我已经搜索并尝试了来自 google 的一些链接,但它们对我不起作用。
显然,您是在网络请求之外执行此操作,WebUtils.retrieveGrailsWebRequest() 将失败,因为没有正在进行的网络请求。如果在测试期间从控制器调用您的服务,它应该可以工作。
为什么不将区域设置作为参数传递给 getMessage 而不是依赖于 WebRequest 的服务,控制器可以调用 getMessage 并传递请求区域设置,否则服务将选择默认区域设置。让服务知道 web api(例如请求、响应、会话等)通常不是一个好主意。您将能够同时测试服务和控制器。
我已经为此需求编写了集成测试而不是单元测试,并且能够 运行 我的测试用例成功。
我创建了一个简单的实用程序 class UtilService.groovy 并且当我尝试 运行 为它编写测试用例时。 class UtilService {
static transactional = true
def messageSource
HttpServletRequest getCurrentRequest() {
GrailsWebRequest webUtils = WebUtils.retrieveGrailsWebRequest()
def request = webUtils.getCurrentRequest()
return request
}
String getMessage(String code, Object[] args = null, String defaultMessage = null) {
HttpServletRequest request = currentRequest
Locale locale = request.locale
if (defaultMessage) {
return messageSource.getMessage(code, args, defaultMessage, locale)
} else {
return messageSource.getMessage(code, args, locale)
}
}
测试用例
@TestMixin(GrailsUnitTestMixin)
class UtilServiceSpec extends Specification {
void "Test get message"() {
setup:
def utilService = new UtilService()
when:
String data = utilService.getMessage("payCode.label")
then:
data == "Pay Code"
}
}
错误:
No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread?
我已经搜索并尝试了来自 google 的一些链接,但它们对我不起作用。
显然,您是在网络请求之外执行此操作,WebUtils.retrieveGrailsWebRequest() 将失败,因为没有正在进行的网络请求。如果在测试期间从控制器调用您的服务,它应该可以工作。
为什么不将区域设置作为参数传递给 getMessage 而不是依赖于 WebRequest 的服务,控制器可以调用 getMessage 并传递请求区域设置,否则服务将选择默认区域设置。让服务知道 web api(例如请求、响应、会话等)通常不是一个好主意。您将能够同时测试服务和控制器。
我已经为此需求编写了集成测试而不是单元测试,并且能够 运行 我的测试用例成功。