3

Grails 2.2.3 アプリケーションでテストしたいものに対して、単体テストと統合テストのどちらを使用するべきかわかりません。私はこのようにいくつかのテストを実行したい:

@TestFor(Student)
@Mock(Student)
class StudentTests {

void testFoundStudent() {
        def s = Student.findById(myId)
        assert s != null
        assert s.firstName = 'Grant'
        assert s.lastName = 'McConnaughey'
    }
}

これには私たちのテスト データベースを使用する必要がありますが、それは統合テストになりますか? このコードを単体テストとして実行すると、 で失敗しassert s != nullます。これは、その ID を持つ学生を見つける必要があるため、データベースを使用していないことを意味します。

4

1 に答える 1

5

Grails ユニット テストでは、Gorm を使用してドメイン クラスの相互作用をテストできます。バックグラウンドで Grails はインメモリ データベース (ConcurrentHashMap の実装) を使用して、この動作を模倣します。そうです、その学生はメモリ内データベースに存在せず、最初にそのデータを挿入する必要があるため、null になります。

Student.findOrSaveWhere (firstName: 'Grant',lastName : 'McConnaughey')

あなたの例では、意図がそのデータの存在をテストすることである場合、統合テストを使用してデータベースに接続する必要がありdatasource.groovyます。データをテストする正当な理由がない限り、これは本当に良い考えではありません。

再度テストしようとしているdef s = Student.findById(myId)場合、それは Grails 動的ファインダーであり、おそらく使用しているフレームワークを信頼する必要があるため、価値を追加していません。

ただし、一般的には

通常、単体テストは、データベース、ソケット接続、ファイルリンクなどの I/O を含む物理リソースが存在しない状態で実行されます。

これが役立つことを願っています

于 2013-07-15T15:34:27.460 に答える