Можно ли использовать Jasmine toHaveBeenCalledWith с соответствующим выражением?
Я рассмотрел документацию Jasmine о toHaveBeenCalledWith, чтобы понять, можно ли передавать в регулярном выражении аргумент, если предполагается, что этот аргумент является строкой. К сожалению, это неподдерживаемая функциональность. Также существует проблема выпущенная на github с запросом этой функции.
Я немного вкопал в кодовую базу, и я вижу, как это возможно реализовать внутри существующего совпадения. Я думаю, что было бы более целесообразно реализовать его как отдельный соединитель, так что абстракция будет записана индивидуально.
В то же время, что может быть хорошим способом?
Ответы
Ответ 1
После некоторого рытья я обнаружил, что объекты Jasmine spy имеют свойство calls
, которое, в свою очередь, имеет mostRecent(). Эта функция также имеет дочернее свойство args
, которое возвращает массив аргументов вызова.
Таким образом, можно использовать следующую последовательность для выполнения соответствия регулярного выражения по аргументам вызова, когда нужно проверить, что строковые аргументы соответствуют определенному регулярному выражению:
var mySpy = jasmine.createSpy('foo');
mySpy("bar", "baz");
expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/);
expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/);
Довольно просто.
Ответ 2
В Jasmine 2.0 подпись
И переместилась.
Ответ 3
В качестве альтернативы, если вы следите за методом на объекте:
spyOn(obj, 'method');
obj.method('bar', 'baz');
expect(obj.method.argsForCall[0][0]).toMatch(/bar/);
expect(obj.method.argsForCall[0][1]).toMatch(/baz/);
Ответ 4
Как упоминалось выше, подпись Jasmine 2.0 изменилась. Если вы следите за методом объекта в Jasmine 2.0, решение Nick должно быть изменено, чтобы использовать что-то вроде -
spyOn(obj, 'method');
obj.method('bar', 'baz');
expect(obj.method.calls.mostRecent().args[0]).toMatch(/bar/);
expect(obj.method.calls.mostRecent().args[1]).toMatch(/baz/);
Ответ 5
С Jasmine 2.2 вы можете использовать jasmine.stringMatching
:
var mySpy = jasmine.createSpy('foo');
mySpy('bar', 'baz');
expect(mySpy).toHaveBeenCalledWith(
jasmine.stringMatching(/bar/),
jasmine.stringMatching(/baz/)
);
Ответ 6
Иногда более удобно писать так:
spyOn(obj, 'method').and.callFake(function(arg1, arg2) {
expect(arg1).toMatch(/bar/);
expect(arg2).toMatch(/baz/);
});
obj.method('bar', 'baz');
expect(obj.method).toHaveBeenCalled();
Это дает более ясную видимость аргументов метода (вместо использования массива)