2012-07-17 3 views
0

grails 동적 가져 오기 메소드를 사용하여 도메인 객체를 얻으려고 할 때 내 통합 - my grails 애플리케이션 테스트가 null 객체를 반환합니다. 이것은 간단한 문제의 예입니다. 내가 컨트롤러 또 다른 추적기 도메인에 대한 업데이트 로그인 도메인을 저장하는 서비스 TrackerLogService를 사용 TrackerLogController이 있다고 할 수 있습니다. 도메인 추적기 :DB 지속성을 테스트 할 Grails에 통합 테스트 작성하기

class Tracker { 

    int id 
    String name 

    static hasMany = [logs: Log] 
} 

도메인 로그인 :

class Log { 
    int id 
    String comment 

    static belongsTo = [tracker: Tracker] 
} 

컨트롤러 TrackerLogController 할인 혜택 :

def TrackerLogService 

def saveTrackerLog() { 

    def trackerId = params.trackerId 

    def trackerInstance = Tracker.get(trackerId) 
    Log log = TrackerLogService.saveTrackerLogs(trackerInstance, params.comment) 
    if(log.hasErrors()){ 
     //render error page 
    } 
    //render good page 
} 

서비스 TrackerLogService 저장 :

Log saveTrackerLogs(Tracker tracker, String comment) { 
    Log log = new Log(tracker: tracker, comment: comment) 
    log.save() 
    return log 
} 

을 그래서 지금은 이 서비스에 대한 통합 테스트를 작성하고 싶지만 컨트롤러의 단순한 로직 (오류, 오류 페이지가 다른 페이지 인 경우)을 작성해야하는지 잘 모르겠다. 및 데이터베이스의 지속성을 확인하는 통합 테스트를 수행합니다.

이 내 통합 테스트를 위해 무엇을 가지고 :

class TrackerLogServiceTests { 

    def trackerLogService 

    @Before 
    void setUp(){ 

     def tracker = new Tracker(id: 123, name: "First") 

     tracker.save() 

     //Now even if I call Tracker.get(123) it will return a null value... 
    } 

    @Test 
    void testTrackerLogService() { 
     Tacker trackerInstance = Tracker.get(123) //I have tried findById as well 

     String commit = "This is a commit" 

     //call the service 
     Log log = trackerLogService.saveTrackerLogs(trackerInstance , commit) 

     //want to make sure I added the log to the tracker Instance 
     assertEquals log , trackerInstance.logs.findByCommit(commit) 
    } 
} 

그래서이 예를 들어 내 trackerInstance가 null 객체가 될 것입니다. 나는 Grails 마법이 단위 테스트에서 Mocking 없이는 작동하지 않는다는 것을 알고 있습니다. DB에서의 지속성에 대한 Intigration-Tests를 사용하면 grails 마법을 사용할 수 있습니다.

답변

3

"할당 됨"이라고 선언하지 않는 한 id 값을 지정할 수 없습니다. 지금은 자동 증가를 사용하므로 123 값은 사용되지 않습니다. 그것은 실제로 보안상의 이유로지도 생성자에 의해 무시, 그래서 당신은이 작업을 수행 할 필요가 거라고 :

def tracker = new Tracker(name: "First") 
tracker.id = 123 

하지만 그것은 자동 증가 조회 덮어 얻을 것이다. 대신이 방법을 사용 관련이없는, 또한

class TrackerLogServiceTests { 

    def trackerLogService 

    private trackerId 

    @Before 
    void setUp(){  
     def tracker = new Tracker(name: "First") 
     tracker.save() 
     trackerId = tracker.id 
    } 

    @Test 
    void testTrackerLogService() { 
     Tacker trackerInstance = Tracker.get(trackerId) 

     String commit = "This is a commit" 

     //call the service 
     Log log = trackerLogService.saveTrackerLogs(trackerInstance , commit) 

     //want to make sure I added the log to the tracker Instance 
     assertEquals log , trackerInstance.logs.findByCommit(commit) 
    } 
} 

를 - 그것은 비표준 유형이다 않는 한 id 필드를 선언하지 않는, 예를 들어, String. Grails가이를 version 필드와 함께 추가합니다. 당신이 필요로 내 질문에 도와 주셔서 너무

class Tracker { 
    String name 
    static hasMany = [logs: Log] 
} 

class Log { 
    String comment 
    static belongsTo = [tracker: Tracker] 
} 
+0

감사합니다! 그리고 달콤한! 나는 지금 내 추적 메서드를 내 추적 메서드를 얻고있다. 정확히 무엇을 물었다. 그러나 어떤 이유로 saveTrackerLogs를 호출하려고 할 때 "null 개체를 호출 할 수 없다"라는 메시지가 표시된다. 이는 내 trackerLogService가 null임을 의미한다. 나는 새로운 trackerLogService를 생성 할 필요가 있는가? (grails 서비스는 테스트에 영향을 받는다)? 아니면 컨트롤러를 통해 전화하는 것이 더 쉬울까요? – PJT

+0

또는 흠 .. 만약 내가 내 질문에 다르게 대답 했어야할지 궁금하다. 나는 Trackers로 가득 찬 데이터베이스를 가지고 있고 내 테스트 클래스에 대한 내 void setUp()와 같은 데이터베이스에서 실제로이 스크립트를 테스트하고 싶다. 데이터베이스에 이미 새로운 추적기를 만들지 말고 ("foo") 가져 오십시오 ... 아마도이 질문에 연결된 다른 질문을 작성해야합니다. – PJT

+0

네 - 질문 당 하나의 질문을하는 것이 가장 좋습니다 –