Подтвердить что ты не робот

Можно ли использовать Jasmine toHaveBeenCalledWith с соответствующим выражением?

Я рассмотрел документацию Jasmine о toHaveBeenCalledWith, чтобы понять, можно ли передавать в регулярном выражении аргумент, если предполагается, что этот аргумент является строкой. К сожалению, это неподдерживаемая функциональность. Также существует проблема выпущенная на github с запросом этой функции.

Я немного вкопал в кодовую базу, и я вижу, как это возможно реализовать внутри существующего совпадения. Я думаю, что было бы более целесообразно реализовать его как отдельный соединитель, так что абстракция будет записана индивидуально.

В то же время, что может быть хорошим способом?

4b9b3361

Ответ 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/);

Довольно просто.

Ответ 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();

Это дает более ясную видимость аргументов метода (вместо использования массива)