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

Не может получить jasmine.any(Function) для работы

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

function TestObj() {
    var self = this;
    self.getStuff = function(aString, callback) {
        // TODO
    }
}

describe("server communications", function() {
    it("it calls the server", function() {
        var obj = new TestObj();
        obj.getStuff = jasmine.createSpy();
        // swap the above line for this and it makes no difference
        // spyOn(obj, "getStuff");

        var functionVar = function() {
        };

        obj.getStuff("hello", functionVar);

        expect(obj.getStuff).toHaveBeenCalledWith(
                [ "hello", jasmine.any(Function) ]);
    });
});

Вместо прогона unit test, я получаю следующий вывод:

Ожидаемый шпион, с которым были вызваны: [['hello', < jasmine.any(function Function() {[собственный код]}) > ]] но был вызван с: [['hello', Function]]

Почему это не признает, что функции, которые я передаю (функция() {}), фактически являются функциями? Что это за собственный код, который он ожидает? У кого-нибудь еще была проблема с jasmine.any(Function)? Thankyou!

EDITED

Я попытался использовать spyOn вместо jasmine.createSpy(), и это не имеет никакого значения. Я попробовал только один аргумент, и он работает. Ввод первого аргумента строки разбивает jasmine.any(Function) - любые идеи?

4b9b3361

Ответ 1

А, я думал, что вам нужно приложить аргументы expect().toHaveBeenCalledWith в Array[]. Дурак я. Вот рабочая версия:

function TestObj() {
    var self = this;
    self.getStuff = function(aString, callback) {
        // TODO
    }
}

describe("server communications", function() {
    it("it calls the server", function() {
        var obj = new TestObj();
        obj.getStuff = jasmine.createSpy();
        // swap the above line for this and it makes no difference
        // spyOn(obj, "getStuff");

        var functionVar = function() {
        };

        obj.getStuff("hello", functionVar);

        expect(obj.getStuff).toHaveBeenCalledWith("hello", jasmine.any(Function));
    });
});

Ответ 2

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

describe("test", function() {
  return it("is function", function() {
    var a = {b: function(){}};
    spyOn(a, 'b');
    a.b(function(){});
    expect(a.b).toHaveBeenCalledWith(jasmine.any(Function));
  });
});

Вы также можете написать свой собственный Matcher, чтобы проверить, является ли переданное значение функцией:

describe('test',function(){
  it('is function',function(){

    this.addMatchers({
      isFunction: function() {
        return typeof this.actual  === 'function';
      }
    });
    expect(function(){}).isFunction();
  });
});

EDITED: кодифицировал первый фрагмент кода