Javascript单元测试 - 使用Jasmine监视自我调用函数

时间:2013-10-17 10:07:06

标签: javascript unit-testing jasmine

使用这样的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版本,但我看不出你是如何传入它的。

2 个答案:

答案 0 :(得分:1)

好问题!测试是关键。

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

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'对象

答案 1 :(得分:0)

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

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

但是如果没有gloabl变量你不能测试它,那么因为undefined被传递给测试并且它总是会失败,因为你不能在函数范围内更改私有变量。