我创建了一个简单的util类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?
我搜索并尝试了谷歌的一些链接,但它们对我不起作用。
答案 0 :(得分:0)
显然,您是在Web请求之外进行的,WebUtils.retrieveGrailsWebRequest()将失败,因为没有Web请求正在进行。如果在测试期间从控制器调用了您的服务,它应该可以工作。
为什么不将您的Locale作为参数传递给getMessage,控制器可以调用getMessage并传递请求Locale,否则服务将选择默认的语言环境,而不是根据WebRequest进行服务。让服务了解web apis(例如请求,响应,会话等)通常不是一个好主意。您将能够测试服务和控制器。
答案 1 :(得分:0)
我已经为此要求编写了集成测试而不是单元测试,并且能够成功运行我的测试用例。