我想用飞镖有超过MongoDB实例一个很好的和简单的一层,我不能设法做到这一点:如何用dart创建一个简单的mongo外观?
给出一个MongoDB实例“测试 - 蒙戈层”:
蒙戈壳:
使用测试蒙戈层切换到DB测试蒙戈层 db.users.find() { “_id”:的ObjectId( “524b1bf8fbfe21c9c4cdb772”), “名”: “托托”,“登录“:”toto“} {”_id“:ObjectId(”524b1bf8fbfe21c9c4cdb772“),”name“:”Titi“,”login“:”titi“}
而一个model.dart源文件:
class User {
String name;
String login;
User(this.name, this.login)
User.fromJson(Map map) {
name = map['name'];
login = map['login'];
}
}
而一个persistence.dart源文件:
import 'package:mongo_dart/mongo_dart.dart';
import '../lib/model.dart';
class PersistenceLayer{
Db _mongodb;
PersistenceLayer(this._mongodb)
List<User> getUsers() {
List<User> users = new List();
_mongodb.open().then((o){
return __mongodb.collection('users').find().forEach((jsonUser){
User user = new User.fromJson(jsonUser);
users.add(user);
});
}).then((jsonUsers){
_mongodb.close();
});
return users;
}
}
当我启动了以下测试:
import 'package:mongo_dart/mongo_dart.dart';
import 'package:unittest/unittest.dart';
import '../lib/model.dart' ;
import '../lib/persistence.dart' ;
main() {
Db db = new Db("mongodb://127.0.0.1/test-mongo-layer");
test('Test get users',() {
PersistenceLayer persistence = new PersistenceLayer(db);
var users = persistence.getUsers();
expect(users.length, 2);
}
}
然后,有一个例外:
未捕获的错误:预期:< 2> 实际:< 0> <
这是很简单,但它不工作,我必须和未来,因为残局当我执行它调试甚至不执行的代码......
SOLUTION:感谢亚历山大
持久性.dart源文件:
Future<List<User>> getUsers() {
List<User> users = new List();
return _mongodb.open()
.then((_){
return _mongodb.collection('users').find().forEach((jsonUser){
User user = new User.fromJson(jsonUser);
users.add(user);
});
})
.then((_) {
return users;
})
.whenComplete((){
_mongodb.close();
});
}
测试:
test('Test get users',() {
PersistenceLayer persitence = new MongoPersistence(db);
Future<List<User>> usersFuture = persistence.getUsers();
usersFuture.then((users) => expect(users.length, 2) );
});
所以我不能让getUsers()同步,只要它使用提供异步函数的mongo_dart库? –
确切!异步是有感染力的。一旦你在一个函数中有一个'Future',你几乎总是必须使该函数返回一个'Future'。 –