2010-12-07 7 views
0

나는 컨트롤러Grails 컨트롤러의 응답 상태를 어떻게 단위 테스트합니까?

def render201 = { 
    render(status:201) 
} 

def render202 = { 
    response.setStatus(202) 
} 

def render203 = { 
    response.setStatus(203) 
    render(status:203) 
} 

def render204 = { 
    response.setStatus(204) 
    render(status:205) 
} 

에서 다음과 같은 기능을 가지고 있습니다 그리고 당신은 '돈 있을지

void test201() { 
    controller.render201() 
    assertEquals(201, controller.response.status) 
} 

void test202() { 
    controller.render202() 
    assertEquals(202, controller.response.status) 
} 

void test203() { 
    controller.render203() 
    assertEquals(203, controller.response.status) 
} 

void test204() { 
    controller.render204() 
    assertEquals(204, controller.response.status) 
} 

test201이 메시지 몇 가지 이유를 들어

junit.framework.AssertionFailedError: expected:<201> but was:<200> 

으로 다음 테스트를 실패했습니다 명시 적으로 응답 상태를 설정하면 렌더링은 단위 테스트에서 실행될 때 항상 200을 반환합니다.

또한 브라우저에서 실제로 이것을 호출하면 render202가 오류를 반환하지만 render201과 render203은 정상적으로 작동합니다. 나는 render204가 무엇을 할 것인지 모른다.

여기 무슨 일 이니? 이것이 Grails의 버그입니까? 이 같은

답변

1

시도 뭔가 :

assertEquals(201, controller.renderArgs.status) 

그것은 나를 위해 일했습니다. https://svn.codehaus.org/grails/trunk/grails/src/groovy/grails/test/MockUtils.groovy

clazz.metaClass.getForwardArgs = {-> fwdArgs} 
clazz.metaClass.getRedirectArgs ={-> redArgs} 
clazz.metaClass.getRenderArgs ={-> renArgs} 
clazz.metaClass.forward = {Map map -> forwardArgs.putAll(map)} 
clazz.metaClass.redirect = {Map map -> redirectArgs.putAll(map)} 
clazz.metaClass.render = {String text -> delegate.response.writer << text} 
clazz.metaClass.render = {Converter arg -> delegate.response.writer << arg.toString()} 
+0

Grails 2.2+에서 '@ TestFor' 주석을 올바르게 사용한다면'response.status'를 사용할 수 있습니다. – Joseph

1

예상 : < 201>하지만했다 : 당신이 mockController의 내부를 이해하려면

, 볼 < 200> 당신이 어떤 응답을 반환 작업을 요청하기 위해 노력을 의미한다. 201 테스트를 원할 경우 메소드를 void로 처리해야합니다.

관련 문제