0

Grails 1.3.7から2.2に移行する理由の1つは、(多くの)基準を単体テストできることです。

そして、基準テストで最初に遭遇したのはこれです:

プロパティ[nightly.id]は、grails.gorm.CriteriaBuilder.validatePropertyName(CriteriaBuilder.java:968)のクラス[com.litle.bldvwr.Result]の有効なプロパティではありません。

私たちが持っているのは、結果と夜間の単純な多対1の関係です。各結果には毎晩1つあります。NightlyとResultの間に直接の関係はありません。

更新しました

具体的なコードは次のとおりです。Nightly.groovy:

package examples

import java.util.Date;

class Nightly {
    String name 
    String status

    static constraints = {
        status nullable:true
        name unique: true, nullable: false, blank: false
    }

    static mapping = {
    }
    String toString () {
        name +' ' + status
    }


}

Result.groovy:

package examples

import java.util.Date;

class Result {
String status
String name
String type
Nightly nightly



static mapping = {
}

Result() {
}

static def gimmeCountByNightlyAndStatusAndRerunIsNull(def nightly, def status) {
    def count = Result.createCriteria().count {
        and {
            eq('nightly.id', nightly.id)
            eq('status', status)
            isNull('rerun')
        }
    }
    return count
}

}

ResultTests.groovy

package examples

import grails.test.mixin.*
import org.junit.*

@TestFor(Result)
@Mock(Nightly)
class ResultTests {

void testCriteriaMess ()    {

            //this test will fail due to: Property [nightly.id] is not a valid property of class [examples.Result]

            Nightly night = new Nightly( name:'nightly1', status:'Success')
            night.save(validate:false)


            Result res = new Result(status: 'SUCCESS', type: 'INTEGRATION')
            res.nightly = night
            res.save(validate:false, flush:true)

            def count = Result.gimmeCountByNightlyAndStatusAndRerunIsNull(night, 'SUCCESS')
            assertTrue count==0
        }
}

上記のコードは、GGTS3.1で作成された新しいGrails2.2プロジェクトからのものです。上記のコードを除いて、プロジェクト内の他のすべては完全なボイラープレートが生成されています。

実際のデータベースと同様に、「nightly.id」はResultテーブルのnightly_id列に変換されると思います。

これは、2.2でGORMがどのようにモックされているかに関する問題ですか、それとも何かが足りないのでしょうか。

4

1 に答える 1

1

クエリを次のように変更する必要があります

def count = Result.createCriteria().count {
        and {
            eq('nightly', nightly)
            eq('status', status)
            isNull('rerun')
        }
    }
于 2013-02-10T09:48:44.160 に答える