Функцию обезьяна-ямочный Жасмин это() в журнал ошибок


Введение асинхронного встроенная поддержка в Жасмин не лог ошибки (т. е., конкретный номер строки, где произошла ошибка) в консоли. Поэтому, чтобы обойти это поведение и сделать появления ошибок в консоли, я придумал следующее решение, чтобы залатать Жасмин.

У меня есть следующие функции, которые я реализовал для исправления обезьяна Жасмин. И я хотел бы использовать ту же функцию для других функций, таких как beforeEach, beforeAll и так далее..

     function patchJasmineForAsyncError(method: string) {
        let oldFn = window[method];
        if (method === 'it' || method === 'fit') {
            window[method] = function (desc: string, fn: Function) {
                    oldFn(description, (done) => {
                    let p = fn();
                    if (p instanceof Promise) {
                        p.then(() => done()).catch(e => {
                            console.error(e);
                            done.fail(e);
                        });
                    }
                    });
            }
        } else {
            window[method] = function (axn: Function) {
                oldFn((done) => {
                    let p = axn();
                    if (p instanceof Promise) {
                        p.then(() => done()).catch(e => {
                            console.error(e);
                            done.fail(e);
                        });
                    }
                });
            }
        }
} 

Как можно увидеть вторую часть функции ( else блок) имеет довольно много дублирования. Мне было интересно, если есть элегантный способ, чтобы свести к минимуму этот и реализовать функцию.

Примечание: it и fit функции имеют два аргумента desc и fn.. но beforeAll, beforeEach.. и т. д. Есть только один аргумент axn.



Комментарии
1 ответ

Просто вынести его на закрытие

function patchJasmineForAsyncError(method: string) {
let oldFn = window[method];
function create_logger(fn: Function) {
return (done) => {
let p = fn();
if (p instanceof Promise) {
p.then(done).catch(e => {
console.error(e);
done.fail(e);
});
}
}
}

if (method === 'it' || method === 'fit') {
window[method] = function(desc: string, fn: Function) {
oldFn(desc, create_logger(fn));
}
} else {
window[method] = function (axn: Function) {
oldFn(create_logger(axn));
}
}
}

Мы можем прибраться немного больше, избавившись от какой-то магии. Я также избавилась от () => done() потому что это так же, как done.

function patchJasmineForAsyncError(method: string) {
let oldFn = window[method];
function create_logger(fn: Function) {
return (done) => {
let p = fn();
if (p instanceof Promise) {
p.then(done).catch(e => {
console.error(e);
done.fail(e);
});
}
}
}

let allowed_methods = ['it', 'fit'];
if (allowed_methods.includes(method)) {
window[method] = function(desc: string, fn: Function) {
oldFn(desc, create_logger(fn));
}
} else {
window[method] = function (axn: Function) {
oldFn(create_logger(axn));
}
}
}

Мы можем также уменьшить некоторые дублирования в присвоении window[method] если мы хорошо с добавлением незначительного замедления в функции, которая должна быть тонкой.

function patchJasmineForAsyncError(method: string) {
let oldFn = window[method];
function create_logger(fn: Function) {
return (done) => {
let p = fn();
if (p instanceof Promise) {
p.then(done)
.catch(e => {
console.error(e);
done.fail(e);
});
}
}
}
let allowed_methods = ['it', 'fit'];
window[method] = function() {
if (allowed_methods.includes(method)) {
oldFn(arguments[0], create_logger(arguments[1]));
} else {
oldFn(create_logger(arguments[0]));
}
}
}

1
ответ дан 8 марта 2018 в 12:03 Источник Поделиться