11

簡単なサービス メソッドをテストしようとしています。そのメソッドは主に、1つの結果を返すかどうかをテストしたい基準クエリの結果を返すだけです(クエリの対象に応じて)。

問題は、対応するテストを正しく修正する方法がわからないことです。私はスポックを介してそれを達成しようとしていますが、他のテスト方法でも同じことをしても失敗します。

目の前のタスクで機能するようにテストを修正する方法を教えてもらえますか?

(ところで、可能であれば単体テストを行いたいと思います。)

EventService メソッド

public HashSet<Event> listEventsForDate(Date date, int offset, int max) {
    date.clearTime()

    def c = Event.createCriteria()
    def results = c {
        and {
            le("startDate", date+1) // starts tonight at midnight or prior?
            ge("endDate", date)     // ends today or later?
        }
        maxResults(max)
        order("startDate", "desc")
    }
    return results
}

スポック仕様

package myapp

import grails.plugin.spock.*
import spock.lang.*

class EventServiceSpec extends Specification {

    def event
    def eventService = new EventService()

    def setup() {
        event = new Event()

        event.publisher = Mock(User)
        event.title     = 'et'
        event.urlTitle  = 'ut'
        event.details   = 'details'
        event.location  = 'location'
        event.startDate = new Date(2010,11,20, 9, 0)
        event.endDate   = new Date(2011, 3, 7,18, 0)
    }

    def "list the Events of a specific date"() {
        given: "An event ranging over multiple days"

        when: "I look up a date for its respective events"
        def results = eventService.listEventsForDate(searchDate, 0, 100)

        then: "The event is found or not - depending on the requested date"
        numberOfResults == results.size()

        where:
        searchDate              | numberOfResults
        new Date(2010,10,19)    | 0     // one day before startDate
        new Date(2010,10,20)    | 1     // at startDate
        new Date(2010,10,21)    | 1     // one day after startDate
        new Date(2011, 1, 1)    | 1     // someday during the event range
        new Date(2011, 3, 6)    | 1     // one day before endDate
        new Date(2011, 3, 7)    | 1     // at endDate
        new Date(2011, 3, 8)    | 0     // one day after endDate
    }
}

エラー

groovy.lang.MissingMethodException: No signature of method: static myapp.Event.createCriteria() is applicable for argument types: () values: []
    at myapp.EventService.listEventsForDate(EventService.groovy:47)
    at myapp.EventServiceSpec.list the Events of a specific date(EventServiceSpec.groovy:29)
4

2 に答える 2

4

基準クエリは単体テストではサポートされていません。mockDomainのドキュメントから:

[T]プラグインは、条件または HQL クエリのモックをサポートしていません。これらのいずれかを使用する場合は、対応するメソッドを手動で (たとえば mockFor() を使用して) 単純にモックするか、実際のデータを使用した統合テストを使用します。

テストを統合テストにする必要があります。テストを test/unit フォルダーから test/integration フォルダーに移動すると、例外がなくなることがわかります。

単体テストで基準をサポートするためにいくつかの作業が行われています。冒険したい場合は、今すぐ試すことができます。DatastoreUnitTestMixin に関するこのメーリング リスト ディスカッションを参照してください。

于 2011-03-08T18:52:38.580 に答える