Будущее в Dart - проклятие моего существования.
У меня есть класс, который вызывает функцию async (Future) для запуска экземпляра базы данных следующим образом:
class DataManager {
bool DbIsReady = false;
Db _db;
DataManager() {
init_mongo_db();
}
void init_mongo_db() {
print("Initializing MongoDB");
_db = new Db("mongodb://127.0.0.1/test");
_db.open().then((_) {
DbIsReady = true;
});
}
Future<List> attemptLogin(String username, String password) {
users = _db.collection("users");
return // ... rest of code cut out for clarity
}
}
Это нормально работает на стороне сервера, потому что при первом запуске сервера инициализируется база данных. К тому времени, когда пользователь действительно пытается войти в систему, база данных инициализирована, и все в порядке. Однако это терпит неудачу, когда я пытаюсь создать для этого интеграционный тест. Когда я создаю класс, база данных еще не инициализирована, поэтому выполнение подпрограммы AttemptLogin завершается ошибкой.
DataManager db = new DataManager();
// This fails miserably, because db hasn't initialized yet.
db.AttemptLogin("test", "test");
Хуже того, в коде используется структура Dart DI, поэтому у меня фактически нет прямого контроля над инициализацией класса DataManager. Это фактическая настройка класса:
setUp(() {
app.addModule(new Module()
..bind(DataManager)
app.setUp();
});
И затем это вызов для проверки функциональности входа в систему, который в конечном итоге вызывает функцию попыткиLogin, которая терпит неудачу:
var req = new MockRequest("/user/login", contentType: 'JSON', method:'POST',
body:JSON.encode(
{"username" : 'test',
"password" : 'test' }));
Как справиться с асинхронным характером инициализации базы данных и по-прежнему проводить имитационное тестирование? В частности, есть ли способ заставить попыткуLogin () Future как-то дождаться завершения инициализации класса DataManager?
Спасибо за помощь, Грег