在Grails集成测试中将对象放在请求上

时间:2013-08-24 17:19:16

标签: grails grails-controller

在我看到的Grails项目中,过滤器将一个Domain对象放在请求上......

class TokenFilters {

    def filters = {

        all( uri: '/hiphop/**' ) {

            before = {
                MyToken myToken = ...
                request.myToken = myToken

MyToken看起来像:

class MyToken {
    String id
    String token
    static mapping = {
        token( index:  true )
        id( generator: 'uuid' )
    }
    ...
 }

在我的控制器中,myToken被取消请求。

MyController {
    myaction {
        MyToken accessToken = request.myToken

一切都很好。我希望为控制器编写集成测试。

@Test
void testLogin() {
    def mc = new MyController()    
    def myToken = new MyToken(1234);
    // set the request parameters
    mc.request.parameters = [myToken:myToken];
    def message = mc.action();
    assertTrue(message.indexOf("trans") > 0)

}

当我跑步时,我得到:

Failure:  testLogin(MyTests)
|  java.lang.IllegalArgumentException: Parameter map value must be single value  or array of type [java.lang.String]
    at testLogin(MyTests.groovy:40)

所以看起来Grails只会让我一个String或一个值,并且不喜欢我在Filter中的请求上放置一个对象。即使你让我在过滤器中放置相同的对象类型。

我真的很想在不进行功能测试的情况下测试它。请帮忙。我使用的是Grails 2.2.1

由于

1 个答案:

答案 0 :(得分:3)

问题是您的代码是将参数传递给控制器​​。您模拟无法处理对象的HTTP请求。你能做的是:

mc.request.parameters = [myToken: '1234']

然后你是控制器/过滤器将拉出1234并查找MyToken。如果您正在测试控制器转发,那么您可以将对象放入请求中。不是相反。

我现在看到问题的一部分是你正在尝试测试假定数据来自过滤器的控制器。

您省略了一些代码,但假设您正在扩展ControllerUnitTestCase,那么您可以访问模拟请求对象。你应该能够做到:

@Test
void testLogin() {
    def mc = new MyController()    
    def myToken = new MyToken(1234);
    // set the request parameters
    request.myToken = myToken
    def message = mc.action();
    assertTrue(message.indexOf("trans") > 0)
}