gpt4 book ai didi

unit-testing - Grails 2.0 单元测试过滤器 : service injection and dependsOn

转载 作者:行者123 更新时间:2023-12-04 12:48:24 27 4
gpt4 key购买 nike

目前将 grails 1.3.7 应用程序升级到 2.1.0 并有一组我想测试的过滤器。视为 grails documentation for testing filters建议现在支持过滤器的单元测试(/推荐?它在功能部分中提到但没有找到示例),我正在尝试将过滤器的一些现有集成测试转换为单元测试。

但是,我正在努力正确地“模拟”过滤器这个过滤器dependsOn/至少为某些 service 正确实现模拟正在注入(inject)过滤器的 s。

package com.example

import ... // excluded for brevity


class MyFilters {

GrailsApplication grailsApplication
SomeService someService

def dependsOn = [MyOtherFilters]


def filters = {
all(controller: 'controllerToExclude', invert: true) {
before = {
if (grailsApplication.config.someConfigProperty) {
def someProperty = request.getAttribute('MY_ATTRIBUTE')

if (someProperty = someService.someMethod()) {
redirect(url: someService.getNewUrl(session))
return false
}
}
return true
}
}
}
}

另一个过滤器:
package com.example

class MyOtherFilters {

SomeOtherService someOtherService

def filters = {
all(controller: '*', action: '*') {
before = {
def foo

if (params[MY_ATTRIBUTE]) {
foo = params[MY_ATTRIBUTE]
someOtherService.setMyAttribute(sitePreference, request)
}

if (!foo) {
foo = someOtherService.getMyAttribute(request)
}

if (foo) {
request.setAttribute('MY_ATTRIBUTE', foo)
}

return true
}
}
}
}

这是我正在使用的两个过滤器的一个非常简化的骨架版本(如果有人好奇,他们会阅读移动设备与桌面设备的偏好,然后根据该偏好进行过滤)。

所以我正在写的测试大致是这样的:
package com.example

import grails.test.mixin.TestFor // ... etc more imports here

@TestFor(SomeController)
@Mock(MyFilters) // TODO what goes here???
class MyFiltersTests {

static final IPAD_USER_AGENT = 'Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X; en-us) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3'
static final NON_MOBILE_USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.12011-10-16 20:23:00'


void testFilterRedirects() {
grailsApplication.config.someConfigProperty = true
// actual filter logic acts on this user-agent through some service calls, would like to mock it out though
request.addHeader("user-agent", IPAD_USER_AGENT)
def result

withFilters(action: "index") {
result = controller.index()
}

//assertSomething on result perhaps
assertEquals "myExpectedRedirectUrl", response.redirectedUrl
}
}

就这段代码而言,它甚至不执行 MyFilters代码。我尝试将依赖过滤器添加到模拟 ala:
@Mock([MyFilters, MyOtherFilters]) 

但后来我遇到了 SomeOtherService 的问题方法没有被定义,并且没有找到正确模拟这些方法的方法(如何在过滤器上设置服务模拟?在 Controller 或服务上,您可以 def myMock = mockFor(SomeOtherService) 然后执行 controller.someOtherService = myMock.createMock() 或类似的操作,但是我找不到使用文档建议使用的 withFilters block 设置过滤器服务的方法。

理想情况下,我会 mock 与 someService 相关的任何事情。和 MyOtherFilters ,并且只是在这个过滤器上编写我的测试,但不确定测试过滤器有什么可能。

任何见解将不胜感激,如果您能做到这一点,非常感谢!

最佳答案

有同样的问题。 Grails Jira 中出现了一个错误 http://jira.grails.org/browse/GRAILS-8976

我在 http://delvingintodev.carrclan.us/2012/12/testing-grails-filters-that-use-services.html 中找到了解决方法'测试使用服务的 Grails 过滤器
'

您基本上必须在过滤器中使用服务,如下所示

package xxx.me

class MyFilters {
def filters = {
all(controller:'*', action:'*') {
before = {
applicationContext.getBean(MyService).doSomethingClever()
}
}
}
}

在这种情况下,您将能够在单元测试中模拟它
package xxx.me

@TestMixin(GrailsUnitTestMixin)
@Mock(MyFilters)
class MyFiltersTests {

@Test
public void testFilter(){
defineBeans {
myService(StubbedMyService)
}
SimpleController controller = mockController(SimpleController);

withFilters(controller:"simple" , action:"index"){
controller.index()
}
}
}

class StubbedMyService extends MyService {
def doSomethingClever(){
}
}

关于unit-testing - Grails 2.0 单元测试过滤器 : service injection and dependsOn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15237159/

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