gpt4 book ai didi

Dart - 如何模拟返回 future 的方法

转载 作者:行者123 更新时间:2023-12-03 03:33:13 29 4
gpt4 key购买 nike

我有一个类,它定义了一个返回 Future 的方法。 Future 包含一个也返回 future 的类列表。

    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() 方法。

我不确定模拟 Future 是个好主意 - 创建一个包含模拟列表的“真实”Future 不是更好吗?

任何想法都会非常有帮助!

最佳答案

由于您只想验证 UserAlbum 中的方法是否被调用,因此您不需要模拟 Future .

验证模拟在这里有点棘手,因为您在构造函数内链接了 future。稍微了解一下如何event loop在 Dart 中工作,我建议使用 future 并在创建演示者后调用 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);
}));
});
}

关于Dart - 如何模拟返回 future 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22084339/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com