Пропустить выброшенную ошибку с completeError

#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 это