1

在我在这里查看的 Grails 项目中,过滤器将域对象放在请求中......

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 只会让我一个字符串或单个值,并且不喜欢我在过滤器中的请求上放置一个对象。即使你它让我在过滤器中放置相同的对象类型。

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

谢谢

4

1 回答 1

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)
}
于 2013-08-24T17:39:51.163 回答