1

コントローラーに次の機能があります

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>

なんらかの理由で、レスポンス ステータスを明示的に設定しないと、render は単体テストから実行されると常に 200 を返します。

さらに、これらを実際にブラウザーから呼び出すと、render202 はエラーを返しますが、render201 と render203 は問題なく動作します。render204 が何をするのかわかりません。

何が起きてる?これは Grails のバグですか?

4

2 に答える 2

2

このようなことを試してください:

assertEquals(201, controller.renderArgs.status)

それは私のために働いた。

mockController の内部を理解したい場合は、 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()}
于 2011-03-30T07:47:20.567 に答える
1

expected:<201> but was:<200> は、何らかの応答を返す操作を要求しようとしたことを意味します。201 をテストする場合は、メソッドを無効にする必要があります。

于 2013-06-29T07:25:36.210 に答える