Spock没有找到线程绑定请求

时间:2015-03-27 13:09:19

标签: grails spock

我创建了一个简单的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? 

我搜索并尝试了谷歌的一些链接,但它们对我不起作用。

2 个答案:

答案 0 :(得分:0)

显然,您是在Web请求之外进行的,WebUtils.retrieveGrailsWebRequest()将失败,因为没有Web请求正在进行。如果在测试期间从控制器调用了您的服务,它应该可以工作。

为什么不将您的Locale作为参数传递给getMessage,控制器可以调用getMessage并传递请求Locale,否则服务将选择默认的语言环境,而不是根据WebRequest进行服务。让服务了解web apis(例如请求,响应,会话等)通常不是一个好主意。您将能够测试服务和控制器。

答案 1 :(得分:0)

我已经为此要求编写了集成测试而不是单元测试,并且能够成功运行我的测试用例。