gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:25:00 24 4
gpt4 key购买 nike

在一个我正在看的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' )
}
...
}

在我的 Controller 中,myToken被拉出请求。
MyController {
myaction {
MyToken accessToken = request.myToken

一切都很好。我希望为 Controller 编写一个集成测试。
@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

谢谢

最佳答案

问题在于您的代码正在将参数传递给 Controller ​​。模拟无法处理对象的HTTP请求。您可以做的是:

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

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

现在,我看到问题的一部分是,您正在尝试测试一个假设数据来自过滤器的 Controller 。

您已经省略了一些代码,但是假设您要扩展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)
}

关于grails - 在Grails集成测试中将对象放在请求上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18421141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com