Javascript使用Jasmine来监视自调用功能

Javascript using Jasmine to spy on self-invoking function

本文关键字:调用 功能 监视 使用 Jasmine Javascript      更新时间:2023-09-26

使用这样的javascript结构:

var myClass = function(myArgumentObject) {
    var vm = {
        myFunction: myFunction,
        myVariable: myVariable
    }
    return vm;
    myFunction() {
        myVariable = 1 + 1;
        myArgumentObject.aMethod();
    }
} (myArgumentObject);

如何(如果有的话)使用Jasmine框架来监视(即模拟)myArgumentObject,以便对myFunction进行单元测试?

这样做:

it('test myFunction', function () {
    myClass.myFunction();
    expect(myClass.myVariable).toEqual(2);
});

失败,因为它尝试调用 myArgumentObject 上的方法时出错。我知道我可以用jasmine.createSpy创建一个假版本的myArgumentObject,但我看不到你是如何传递它的。

好问题! 测试是关键。

您可以在测试中定义参数/输入:

it ('test myClass function', function() {
    myArgumentObject = function() {
        this.aMethod: jasmine.createSpy();
    };
    // mock out initial values for your other variables here, eg myVariable
    spyOn(vm, 'myFunction').andCallThrough();
    myClass(myArgumentObject)
    expect(myArgumentObject.aMethod).toHaveBeenCalled()
    expect(vm.myVariable).toEqual(2)
});

要记住的几件事 - 您的"返回 vm"语句将提前切断您的函数 - 您将不需要它。

您应该尽早定义变量,以免出现错误。 考虑将 myFunction 移到 'vm' 对象上方。

所以我假设以下内容,你有一个名为 myArgumentObject 的全局变量,它有函数aMethod 。然后你可以像这样使用茉莉花监视这个功能。

it('test myFunction', function () {
  spyOn(myArgumentObject, 'aMethod')
  myClass.myFunction();
  expect(myClass.myVariable).toEqual(2);
});

但是如果没有全局变量,则无法对此进行测试,因为undefined被传递给测试并且它将始终失败,因为您无法更改函数范围内的私有变量。