3

このコマンド オブジェクトには、Grails で生成された単体テストだけでなく、手動で記述したものも使用しました。

   package myapp

    @grails.validation.Validateable
    class SearchCommand {
       String basisBuild
       String buildToSearch

       static constraints = {
          basisBuild(blank: false)
       }
    }

手書きの単体テストが失敗した後、Grails を使用しました。

create-unit-test  myapp.SearchCommand

単体テストに記入し、モック化された制約に関するドキュメントごとに 合格する必要があるアサーションを作成しました。

package myapp
import static org.junit.Assert.*

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

@TestMixin(GrailsUnitTestMixin)
class SearchCommandTests {

    void setUp() {
        mockForConstraintsTests(SearchCommand)
    }

    void tearDown() {
        // Tear down logic here
    }

    void testSomething() {
        SearchCommand commandUnderTest = new SearchCommand()

        commandUnderTest.validate(basisBuild: "")

        assertEquals "blank", commandUnderTest.errors['basisBuild']
    }
}

なぜこの失敗が発生するのですか?

grails> test-app
| Running 9 unit tests... 9 of 9
| Failure:  testSomething(com.siemens.soarian.sf.gap.SearchCommandTests)
|  java.lang.AssertionError: expected:<blank> but was:<null>
        at org.junit.Assert.fail(Assert.java:93)
4

3 に答える 3

5

grails 2.0 で Command オブジェクトを単体テストするための、grails でサポートされている方法を見つけたと思います。ControllerUnitTestMixin が提供する mockCommandObject を使用する必要があります。

エリックの功績

http://www.jworks.nl/2012/04/12/testing-command-objects-in-grails-2-0/

于 2013-05-24T15:10:42.467 に答える
2

編集

validate()適切に使用するとmockForConstraintsTest、既存のGrails バグに記載されているパッチが適用されている場合に機能するはずです (それを取り上げてくれた @codelark に感謝します)。( を使用して) Web アプリの観点からコマンド オブジェクトをテストするにはcontroller、以下の情報が役立ちます。

コントローラーアクションを使用してコマンドオブジェクトをテストします:-

オブジェクトは、内のメソッドの 1 つでパラメーターとして使用される場合にのみ、そのcommandように見なされます。コマンド オブジェクトを参照してください(警告 NOTE)。アクション メソッドで使用すると、次のことができるはずです。actioncontrollerSearchCommandassertEquals

サンプル:

void testSomething() {
        YourController controller = mockController(YourController) //Or instantiate
        SearchCommand commandUnderTest = new SearchCommand ()
        //Note the usage here. validate() does not take parameters
        commandUnderTest.basisBuild = ''
        commandUnderTest.validate()

        //Call your action
        controller.searchCommandAction(commandUnderTest)

        assert response.text == 'Returned'
        assertEquals "blank", commandUnderTest.errors['basisBuild']
    }

YourController のアクション:-

def searchCommandAction(SearchCommand sc){
    render "Returned"
}

ノート:

Grails バグのパッチがないと、@Grails 2.1.4、2.2.0、および 2.2.1 で以下のエラーが表示されます。

のみを修正しvalidationて使用mockForConstraintTestsせずに使用すると、エラーが発生しcontroller actionます。

ここに画像の説明を入力

于 2013-04-19T18:03:39.260 に答える
0

メソッドの使い方がvalidate間違っています。クラスにフィールドを設定することはないため、フィールドは空白ではなく null です。次のようにテストを変更してみてください。

void testSomething() {
    SearchCommand commandUnderTest = new SearchCommand()
    commandUnderTest.basisBuild = ""

    assertFalse commandUnderTest.validate()
    assertEquals 'blank', commandUnderTest.errors['basisBuild']
}

編集:注釈を使用するコマンド クラスをテストするときに、 grails のバグもあります。@Validatableバグ解説にいくつかの回避策があります。

于 2013-04-19T18:43:15.967 に答える