-1

Web アプリ内の完全なユーザー フローをシミュレートするために、いくつかのコントローラーをテストする目的で、Grails 2.x で統合テストを作成しました。

まず、2 つの単純なドメイン オブジェクト レコードを保存し、テスト ケース内で 2 つのコントローラー インスタンスをインスタンス化しました。この 2 つの単純なクラスは次のとおりです。 - カテゴリ (製品のカテゴリ) と - ストア (製品が販売されるミニ マーケット) コントローラ インスタンスを制御する 2 つのテスト メソッド (StoreController と CategoryController) を書き、正常に動作しました。1 つのカテゴリ レコードが作成され、いくつかの店舗レコードも。

次に、Product レコードを保存するための 3 番目のメソッドを作成しました。このレコードはカテゴリを参照する必要があります。そのため、前のメソッドからカテゴリ インスタンスを取得し、それを他の Product パラメーターと共に ProductController に渡そうとします。

理由は不明ですが、Web アプリ インスタンスを介して Web ブラウザーにデータを入力することによってのみ Product レコードを作成できますが、テスト クラス コードでは作成できません。問題は Product と Category の関係にあると思いますが、新しい Product レコードを作成するためにテスト ケースから ProductController にパラメーターを渡す方法がわかりませんでした。

これは私の製品クラスです:

class Product {

    int id

    String barCode
    String shortDesc
    String longDesc
    String format

    Category category
    static belongsTo = [category: Category]    

    //static hasManySurveyRecord = [surveyRecord: SurveyRecord]


    static constraints = {

            id        editable: false
            barCode   blank: false, nullable: false, maxSize: 64
            shortDesc blank: false, nullable: false, maxSize: 32
            longDesc  blank: false, nullable: false, maxSize: 128
            category  blank: false
    }

    static mapping = {
        table 'product_catalog'
        version false

        columns {
                id column: 'id'
                barCode column: 'bar_code'
                shorDesc column: 'short_desc'
                longDesc column: 'long_desc'
                format column: 'format'
        }
    }

    String toString() {

        return longDesc
    }
}

これは私のカテゴリクラスです:

class Category {

    int id

    String description


    static hasManyProduct = [products: Product]


    static constraints = {

            id            editable: false
            description   blank: false, nullable: false, maxSize: 64
    }

    static mapping = {
        table 'categories'
        version false

        columns {
                id column: 'id'
                description column: 'description'
        }
    }

    String toString() {

        return description
    }
}

これは、このアプリの統合テストです。

static transactional = false

static storeList  = []
static storesData = []

static categoryIns
static categoryData = []

static productIns  = new Product()
static productData = []




@Before
void setup() {

    storesData.add([zipCode: 926260001, address: "first test avenue, first city, CA"    , description: "first testing store"])
    storesData.add([zipCode: 926260002, address: "second test avenue, second city, CA"  , description: "second testing store"])
    storesData.add([zipCode: 926260003, address: "third test avenue, third city, CA"    , description: "third testing store"])
    storesData.add([zipCode: 926260004, address: "fourth test avenue, fourth city, CA"  , description: "fourth testing store"])
    storesData.add([zipCode: 926260005, address: "fifth test avenue, fifth city, CA"    , description: "fifth testing store"])
    storesData.add([zipCode: 926260006, address: "sixth test avenue, sixth city, CA"    , description: "sixth testing store"])
    storesData.add([zipCode: 926260007, address: "seventh test avenue, seventh city, CA", description: "seventh testing store"])
    storesData.add([zipCode: 926260008, address: "eighth test avenue, eighth city, CA"  , description: "eighth testing store"])

    categoryData = [description: "testing category"]

    productData = [barCode: "0114B", shorDesc: "The short testing description", longDesc: "The long testing description ....", format: "1 LT"]
}



@Test
void _01__createStores() {

    def storeCtl = new StoreController()

    (0..7).each { i ->

            def model = storeCtl.create()

            assert model.storeInstance != null

            storeCtl.response.reset()

            storeCtl.params.putAll( storesData.get(i) )
            storeCtl.save()

            assert Store.count() == (i+1)

    }

    storeList.addAll( Store.list() )

    assert storeList.size() == Store.list().size()
}

@Test
void _02__createCategory() {

    // Test if there is a previous store list created
    assert storeList.size() == Store.list().size()

    def categoryCtl = new CategoryController()

    def model = categoryCtl.create()

    assert model.categoryInstance != null

    categoryCtl.response.reset()

    categoryCtl.params.putAll( categoryData )
    categoryCtl.save()

    assert Category.count() == 1

    categoryIns = Category.list()[0]
}

@Test
void _03__createProduct() {

    // Test if there is a previous store list created
    assert storeList.size() == Store.list().size()
    // Test if there is a previous category created
    assert categoryIns != null
    assert categoryIns.id > 0

    def productCtl = new ProductController()

    def model = productCtl.create()

    assert model.productInstance != null

    productCtl.response.reset()

    productData.put("category", [id: categoryIns.id])
    productData.put("category.id", categoryIns.id)
    productCtl.params.putAll( productData )
    //productCtl.params.category = Category.get(categoryIns.id) 
    productCtl.save()

    assert Product.count() == 1
}

これは私の ProductController コードの抜粋です。

def save() {
    def productInstance = new Product(params)
    if (!productInstance.save(flush: true)) {
        render(view: "create", model: [productInstance: productInstance])
        return
    }

    flash.message = message(code: 'default.created.message', args: [message(code: 'product.label', default: 'Product'), productInstance.id])
    redirect(action: "show", id: productInstance.id)
}
4

1 に答える 1

0

両方の推奨事項はうまくいきました。何が問題なのかを何時間も調べた後、あなたのおかげで、私のばかげたばかげた間違いが明らかになりました。フィールド「shortDesc」のつづりが「shorDesc」でした。それで、私の本へのちょっとしたヒントが書かれました。どうもありがとうございました!

于 2013-03-15T17:24:52.580 に答える