2014-02-28 3 views
1

미래를 반환하는 메소드를 정의하는 클래스가 있습니다. 미래에는 미래를 돌려주는 클래스 목록이 포함됩니다.다트 - 미래를 반환하는 메소드 모의 방법

class User{ 
     Future<List<Album>> albums(){ 

     }; 
    } 
    class Album{ 
     Future<List<Photos>> photos(){ 
     } 
    }; 

다른 클래스를 테스트 할 때이 클래스의 방법을 조롱하는 가장 좋은 방법은 무엇입니까?

내가 시험에 노력하고 클래스는

class Presenter { 
    Presenter(User user){ 
     user.albums().then(_processAlbums); 
    } 
    _processAlbums(List<Album> albums) { 
     albums.forEach((album)=>album.photos.then(_processPhotos)); 
    } 
    _processPhotos(List<Photo> photos) { 
    ....stuff 
    } 
} 

같은 비트 내가이 날 생성자가 user.photos라고하는지 테스트 할 수이

class MockUser extends Mock implements User{} 
class MockAlbum extends Mock implements Album{} 
class MockPhoto extends Mock implements Photo{} 

class MockFutureList<T> extends Mock implements Future<T>{ 

    MockFutureList(List<T> items){ 
    when(callsTo("then")).thenReturn(items); 
    } 
} 

void main(){ 

    test("constuctor should request the albums from the user ",(){ 

    MockUser user = new MockUser(); 

    MockAlbum album = new MockAlbum(); 
    List<Album> listOfAlbums = [ album]; 

    MockPhoto photo = new MockPhoto(); 
    List<Album> listOfPhotos = [ album];   
    user.when(callsTo("albums")).thenReturn( new MockFutureList(listOfAlbums));  
    album.when(callsTo("photos")).thenReturn(new MockFutureList(listOfPhotos)); 

    PicasaPhotoPresentor underTest = new PicasaPhotoPresentor(view, user); 

    user.getLogs(callsTo("albums")).verify(happenedOnce); 
    album.getLogs(callsTo("photos")).verify(happenedOnce); 

    }); 
} 

같은 단위 테스트를 작성하는 시도 본다() 메서드를 호출했지만 album.photos() 메서드가 호출되지는 않았습니다.

나는 미래를 조롱하는 것이 좋은 생각인지 모르겠다 - 모의 명단이 포함 된 '진짜'미래를 만드는 것이 낫지 않겠는가?

어떤 아이디어라도 도움이 될 것입니다.

답변

1

UserAlbum의 메소드가 호출되었는지 확인하기 만하면 Future을 조롱 할 필요가 없습니다.

당신이 생성자 안에 미래를 연결하기 때문에 모의 객체가 약간 까다로워지는 것을 확인하십시오. event loop이 Dart에서 작동하는 방식을 조금 이해하면 향후 발표자를 만든 후 expectAsync으로 전화하는 것이 좋습니다.

expectAsync 함수는 단위 테스트 라이브러리가 테스트를 확인하기 위해 호출 될 때까지 대기하도록 지시합니다. 그렇지 않으면 테스트가 예상대로 실행되지 않고 성공적으로 완료됩니다.

import 'package:unittest/unittest.dart'; 

class MockUser extends Mock implements User {} 
class MockAlbum extends Mock implements Album {} 

void main() { 
    test("constuctor should request the albums from the user ",() { 
    var user = new MockUser(); 
    var album = new MockAlbum(); 
    user.when(callsTo("albums")).thenReturn(new Future(() => [album])); 

    var presenter = new PicasaPhotoPresentor(view, user); 

    // Verify the mocks on the next event loop. 
    new Future(expectAsync(() { 
     album.getLogs(callsTo("photos")).verify(happendOnce); 
    })); 
    }); 
} 
:이

, 여기 테스트의 모습한다 무엇
관련 문제