Требует ли Jasmine toThrow matcher, чтобы аргумент был обернут в анонимную функцию? - PullRequest
36 голосов
/ 29 февраля 2012

Документация по https://github.com/pivotal/jasmine/wiki/Matchers включает следующее:

expect(function(){fn();}).toThrow(e);

Как обсуждалось в этом вопросе , следующее не работает, потому что мы хотим передать объект функции в expect, а не результат вызова fn()

expect(fn()).toThrow(e);

Вопрос 1: работает ли следующее?

expect(fn).toThrow(e);

Вопрос 2: Если я определил объект thing с помощью метода doIt, сработает ли следующее?

expect(thing.doIt).toThrow(e);

(2a: если так, есть ли способ передать аргументы методу doIt?)

Эмпирически ответ, кажется, да, но я не верю своему пониманию js scoping достаточно, чтобы быть уверенным.

Спасибо!

Ответы [ 4 ]

48 голосов
/ 05 ноября 2012

Мы можем покончить с оболочкой анонимной функции, используя Function.bind, который был представлен в ECMAScript 5 . Это работает в последних версиях браузеров, и вы можете исправлять старые браузеры, определяя функцию самостоятельно. Пример определения приведен в Mozilla Developer Network .

Вот пример того, как bind можно использовать с жасмином.

describe('using bind with jasmine', function() {

    var f = function(x) {
        if(x === 2) {
            throw new Error();
        }
    }

    it('lets us avoid using an anonymous function', function() {
        expect(f.bind(null, 2)).toThrow();
    });

});

Первый аргумент, предоставленный bind, используется как переменная this при вызове f. Любые дополнительные аргументы передаются f при его вызове. Здесь 2 передается в качестве первого и единственного аргумента.

6 голосов
/ 02 марта 2012

Давайте взглянем на исходный код Jasmine :

try {
  this.actual();
} catch (e) {
  exception = e;
}
if (exception) {
  result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected));
}

Это основная часть метода toThrow.Таким образом, все, что делает метод - это выполняет метод, который вы ожидаете, и проверяете, было ли выброшено исключение.Таким образом, в ваших примерах fn или thing.doIt будет вызываться в Жасмине, чтобы проверить, была ли выдана ошибка и является ли тип этой ошибки тем, который вы передали в toThrow.

5 голосов
/ 05 апреля 2012

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

Я бы предпочел,

expect(myTestFunction, arg1, arg2).toThrow();

Но я в порядке с явным выполнением

expect(function(){myTestFunction(arg1, arg2);}).toThrow("some error");

Обратите внимание, что мы также можем использовать регулярное выражение при ошибке:

expect(function (){myTestFunction(arg1, arg2);}).toThrowError(/err/);
2 голосов
/ 23 января 2018

Если используется так:

expect(myTestFunction(arg)).toThrowAnyError(); // incorrect

Затем функция myTestFunction(arg) выполняется перед expect(...) и выдает исключение, прежде чем у Жасмин появится какая-либо возможность что-либо предпринять, и тест завершается автоматически,

Если функция myTestFunction(arg) ничего не генерирует (т. Е. Код работает не так, как ожидалось), тогда Жасмин получит только результат функции и проверит это на наличие ошибок - что неверно.

Чтобы облегчить это, код, который должен выдать ошибку, должен быть включен в функцию. Это передается Jasmine, который выполнит его и проверит ожидаемое исключение.

expect(() => myTestFunction(arg)).toThrowAnyError(); // correct

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...