3

この質問で説明した問題と非常によく似た問題があります。(主な違いは、Grails 2.1を使用していることです)。

基本的に私は次のような単体テストを書きたいと思っています。

// set params so i can create an obj.
def results = controller.save()

// validate results or model/view
results = controller.edit(id, version)

ただし、これは機能しません。最初のメソッドアクション(保存)がリダイレクトをトリガーし、2番目のアクションもリダイレクトをトリガーし、CannotRedirectExceptionが発生するためです。メッセージ付き:

Cannot issue a redirect(..) here. A previous call to redirect(..) has already redirected the response.

これに対して提案された解決策(さまざまな場所で見つかります)は次のとおりです。

redirectArgs.clear()

ただし、これは機能しません。Grails2、redirectArgsが存在しないため、存在するのは

response.redirectUr

読み取りのみが可能で、書き込みはできません。

私はすでにこれらのことを(さまざまな組み合わせで)試しました:

response.reset()
clearGrailsWebRequest()
bindGrailsWebRequest()
cleanupGrailsWeb()
controller.redirect([:])
controller.redirect(null)
controller = new OfferObjectController()
controller = mockController(OfferObjectController)

すべて運がない。

私は他に何がうまくいく/助けることができるかという考えを完全に使い果たしました。どんな提案でも大歓迎です!

====編集====

私はそれを明確にするのを忘れました

response.reset()

ある種の作業では、別のアクションを呼び出すことができますが、前のアクションによって行われた変更を元に戻す/ロールバックするようです。これはまさに避けたいことです(必要な場合は、呼び出しを独自のテストに入れます[方法])。

4

1 に答える 1

4

答えは

response.reset()

なぜその例外が発生するのかわかりません。ちなみに、1つのタスクと1つのテストを作成する必要があります。

私はあなたがこれを試すことができると思います:

import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
.....

// set params so i can create an obj.
def results = controller.save()

def lastRequest = GrailsWebRequest.lookup().currentRequest
lastRequest.removeAttribute("org.codehaus.groovy.grails.REDIRECT_ISSUED")

// validate results or model/view
results = controller.edit(id, version)
于 2012-08-29T13:29:09.793 に答える