2

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

4

2 回答 2

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)
});

有几件事要记住——你的'return vm'语句会提前关闭你的功能——你不需要它。

您应该尽早定义变量,以免出错。考虑将 myFunction 移到“vm”对象之上。

于 2015-02-27T00:04:07.370 回答
0

所以我假设以下,你有一个名为的全局变量myArgumentObject,它有 function aMethod。然后你可以像这样使用 jasmine 来监视这个函数。

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

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

于 2013-10-19T13:45:15.057 回答