2014-02-28 27 views
1

我有一個類定義了返回Future的方法。未來包含了一個也會返回未來的課程列表。Dart - 如何模擬返回未來的方法

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 
    } 
} 

我試着寫一個單元測試這樣

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); 

    }); 
} 

這讓我測試構造方法調用了user.photos ()方法,但不是調用album.photos()方法。

我不確定嘲笑未來是個好主意 - 創建一個包含Mock列表的「真實」未來會不會更好?

任何想法都會非常有幫助!

回答

1

由於您只想驗證UserAlbum的調用方法,因此您不需要模擬Future

驗證模擬在這裏有點棘手,因爲你在構造函數中鏈接期貨。在對Dart中的event loop工作原理有所瞭解之後,我建議您在創建演示者後使用未來並呼籲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); 
    })); 
    }); 
} 
相關問題