Любой способ шпионить за всем экземпляром с Жасмин - PullRequest
4 голосов
/ 25 января 2012

У меня есть сложный класс javascript, который имеет много функций, многие из которых будут генерировать исключения, если они вызываются вне производственной среды.Мне нужно передать ложные экземпляры этого класса конструктору другого класса в моих тестах, однако я не хочу, чтобы какие-либо функции сложных классов действительно вызывались.То, что я хотел бы сделать, это иметь поддельный объект, который имеет все функции и свойства сложного класса, но все функции должны быть просто шпионами жасмина, которые ничего не делают.

По сути, я хочу иметь возможностьdo

var fakeComplexClass = createFakeObject(ComplexClass);

var testInstanceOfSimpleClass = new SimpleClass( fakeComplexClass);

И будьте уверены, что если testInstanceOfSimpleClass вызовет любую из fakeComplexClass функций, они будут шпионами и, таким образом, не завершат мои тесты.

Я мог бы сделать что-то вроде

var fakeComplexClass = { function1() {};, function2() {}; ... } 

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

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

Спасибозаранее.

Ответы [ 2 ]

1 голос
/ 27 апреля 2013

Я создал небольшую библиотеку, которая работает с jasmine-node.

Использование:

    var MyClass = function (param) {
        this.initialize(param);
    };
    MyClass.prototype.initialize = function (param) {
        if (param != "expectedParam")
            throw new TypeError();
    };

    var mock1 = jasmine.createStub(MyClass, ["*"]);
    expect(mock1.constructor).toHaveBeenCalled();
    expect(mock1.initialize).not.toHaveBeenCalled();

    var mock2 = jasmine.createStub(MyClass, ["initialize"], ["expectedParam"]);
    expect(mock2.initialize).toHaveBeenCalled();
    mock2.initialize.andCallThrough();
    expect(mock2.initialize).toThrow(new TypeError());

lib:

jasmine.createStub = function (cls, methods, args) {
    if (!(cls instanceof Function))
        throw new TypeError("Invalid class param.");

    var mockClass = function () {
        this.constructor.apply(this, args || []);
    };

    mockClass.prototype = Object.create(cls.prototype);
    mockClass.prototype.constructor = cls;

    var wrap = function (method) {
        if (!mockClass.prototype[method] instanceof Function)
            throw new TypeError("Cannot mock " + method + " it's not a function.");
        jasmine.getEnv().currentSpec.spyOn(mockClass.prototype, method);
    };

    if (methods) {
        if (!(methods instanceof Array))
            methods = [methods];
        if (methods.length == 1 && methods[0] == "*")
            for (var property in mockClass.prototype) {
                if (mockClass.prototype[property] instanceof Function)
                    wrap(property);
            }
        else
            for (var i = 0; i < methods.length; ++i) {
                var method = methods[i];
                wrap(method);
            }
    }

    return new mockClass();
};

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

jasmine.getEnv().currentSpec.spyOn(mockClass.prototype, method);

Каким-то образом мой жасминовый узел не имеет метода jasmine.spyOn ...

0 голосов
/ 25 января 2012

Взгляните на SinonJS, он позволяет вам заглушку целый объект:

var stub = sinon.stub(obj); Заглушки всех методов объекта.

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