#dart #dart-async
#dart #dart-асинхронный
Вопрос:
Я пытаюсь написать приложение, которое вставляет запись в mongodb.
Сначала посмотрите на мой тест:
test('Password test failed, not strong enough.', () {
Account.create({'name': 'eric', 'email': 'koston@mail.com', 'password': 'Test'})
.catchError((err) {
expect(err, throwsA(new isInstanceOf<DuplicateError>()));
});
});
Этот тест должен быть неудачным, поскольку пароль недостаточно надежен. И код, который пытается вставить запись.
static Future<String> create(Map account) {
var completer = new Completer();
String hashed_password;
var self = new Account();
if(self._signUpKeys.length != account.length) {
return completer.completeError(new LengthError(I18n.instance.getTextByMap('TEXT1')));
}
for(var singUpKey in self._signUpKeys) {
if (!account.containsKey(singUpKey)) {
return completer.completeError(new ArgumentError(I18n.instance.getTextByMap('TEXT1')));
}
}
// Try to find duplication
Future.wait([findAccountByField('name', account['name']),
findAccountByField('email', account['email'])])
.then((Iterable<Map<String, String>> lists) {
// Check of any duplications
lists.forEach((value){
value.forEach((String key, String value) {
switch(key) {
case('name'):
return completer.completeError(new DuplicateError(
I18n.instance.getTextWithMarker('TEXT2', {'amp;1': value})));
case('email'):
return completer.completeError(new DuplicateError(
I18n.instance.getTextWithMarker('TEXT3', {'amp;1': value})));
}
});
hashed_password = Account.generateHashPassword(account['password']);
self._insert(self._fillDbFields(name: account['name'], email: account['email'], hashed_password: hashed_password,
created_at: new DateTime.now(), activated: false))
.then((result) => completer.complete(result));
});
})
.catchError((err) {
completer.completeError(err);
});
return completer.future;
}
при таком распределении будет выдана ошибка, поскольку пароль не соответствует требованиям безопасности.
hashed_password = Account.generateHashPassword(account['password']);
и эта часть должна перехватить ошибку и завершить ее.
.catchError((err) {
completer.completeError(err);
});
но в тесте я получил ошибку NoSuchMethodError. Почему здесь объект ошибки не передается для тестирования? Что я здесь делаю не так?
Ответ №1:
Я думаю, вам следует проверить, какое значение lists имеет здесь
Future.wait([findAccountByField('name', account['name']),
findAccountByField('email', account['email'])])
.then((Iterable<Map<String, String>> lists) {
если это так, null
вы не можете вызвать forEach
это