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

Я пытаюсь написать приложение, которое вставляет запись в mongodb.
Сначала посмотрите на мой тест:

test('Password test failed, not strong enough.', () {

    Account.create({'name': 'eric', 'email': '[email protected]', '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', {'&1': value})));
                    case('email'):
                        return completer.completeError(new DuplicateError(
                                I18n.instance.getTextWithMarker('TEXT3', {'&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. Почему здесь объект ошибки не передается в тест? Что я здесь делаю неправильно?введите здесь описание изображения


person softshipper    schedule 01.07.2014    source источник


Ответы (1)


Я думаю, вы должны проверить, какие списки значений здесь

Future.wait([findAccountByField('name', account['name']),
             findAccountByField('email', account['email'])])
    .then((Iterable<Map<String, String>> lists) { 

если это null, вы не можете вызвать forEach на нем

person Günter Zöchbauer    schedule 01.07.2014