2012-01-19 9 views
0

ログイングループとそのステータスの一括更新を行うためのフォームがあるとします。使用されるロジックは、可能なすべてのIDとグループのトラックを保持する隠しフィールドを持つことに関するものです。ラジオbtns。それ以降のサービス、私たちのリスト内のIDを確認どんな活性化し、残りを非アクティブスルー:grails:コード対統合テストのlist.containsの振る舞い

def testUpdateLoginStatus() { 
    def id1 = createLogin().id 
    def id2 = createLogin().id 

    String[] allLoginIds = [id1 as String, id2 as String] 
    List<Long> enabledLoginIds = [id1] 

    loginService.updateLoginStatus(allLoginIds, enabledLoginIds) 

    def login1 = Login.get(id1) 
    def login2 = Login.get(id2) 
    assertTrue login1.enabled 
    assertFalse login2.enabled 
} 
Login createLogin() { 
    def now = System.currentTimeMillis() 

    def email = "int-test-" + now + "@somewhere.com" 
    def password = "Pwd" + now + "pwD" 

    def login = new Login(username: email, password: password, firstName: "Integration", lastName: "Test") 
    login.save(flush: true) 
    assertNotNull login.id 

    return login 
} 

def enabledLogins = toList(params.enabledLogins) 
def allLoginIds = params.allLoginIds.toString().split(',') 
loginService.updateLoginStatus(allLoginIds,enabledLogins) 

ここにサービス

def updateLoginStatus(String[] allLoginIds, List<Long> enabledLoginIds) { 
    for (item in allLoginIds) { 
     def login = Login.get(item.toLong()) 
     if (login) { 
      login.enabled = enabledLoginIds.contains(item.toLong()) ? true : false 
      login.save() 
      if (login.hasErrors()) { 
       login.errors.each { log.error(it) } 
      } 
     } 
    } 
} 

そして、ここでの定義は、統合テストです

ここに問題があります:
上記のコードは統合テストに合格しましたが、実際にorkingは私が間違っている、どこかに何とかので、その場合は統合テストに失敗した

enabledLoginIds.contains(item.toLong())
... タイプのうち、 toLongを取る場合を除き...しかし、私は
感謝
Psのそれを見ることができない:1.3 Grailsの0.7

+0

スタックトレース出力はありますか、それとも静かに失敗しますか? – gotomanners

+0

は黙って失敗します – Sepi

+0

'def login = Login.get(item.toLong())'で動作するのは奇妙です。 これはこのサンプルユースケースでは些細かもしれませんが、toLong()を呼び出す前に 'isLong()'でチェックするのがベストプラクティス – gotomanners

答えて

0

すべてのパラメータが文字列として渡って来るので、あなたのコントローラ内のコードは次のとおりです。文字列のリストを作成している

def enabledLogins = toList(params.enabledLogins) 

。これは、アプリケーションを実行しているときに.toLong()を取り出すと機能します。それはやっているので:

["1", "2"].contains("1") 

を代わりにつながる.toLongであなたの現在の実装で:

​​

私はここを参照してください物事のカップルがあります:

1 )ジェネリックはコンパイル時のみであることを覚えておいてください(groovyでは基本的に無意味です)。たとえあなたのメソッドシグニチャーに(... , List<Long> enabledLoginIds)のパラメーターがあっても実行時に、それがロングのリストになるという保証はありません。

2)通常、コントローラーを介した統合テスト。これにより、より良い結果を得ることができます。このような問題を回避するのに役立ちます。テストに合格したが、実稼働環境では動作しないので、テストに何か問題があると思う。

+0

イーストが理にかなっています、ありがとう – Sepi