在一个我正在看的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/