您好我有一个关于使用Jasmine模拟JS代码的问题。
想象一下有以下情况:
function Test(){
var a = 5;
var b = 3;
Test2(a,b);
}
function Test2(a,b){
var result = a + b;
console.log("result of function Test2: ", result);
}
我想用Jasmine模拟我的Test2函数调用。我尝试了以下的事情:
describe("1# Test Mocking", function () {
it("test: Mocking Example", function () {
var myMock = new Test();
spyOn(myMock, "Test2").and.returnValue(10,10);
expect(Test2.result).toEqual(20);
});
});
但Jasmine一直说:Error: Test2() method does not exist
有谁知道这是为什么以及如何解决这个问题?
答案 0 :(得分:1)
我害怕你的代码没有多大意义:
myMock
Test2
的方法,但它没有这样的方法(就像Jasmine告诉你的那样); Test2
只是一个常规功能; Test2
的方法,你在 new Test()
后监视它,此时原来的Test2
已经有了被召唤,间谍宣布为时已晚; Test2
没有返回值,但是你告诉间谍它应该返回10, 10
(在我看来你想要调用它有了这两个值,没有它返回它们); Test2
除了创建局部变量(result
)并记录它之外没有任何副作用(比如返回值或设置实例变量等),这使得它很漂亮不可测; 我认为你需要回到绘图板来制定你希望班级做什么。为了帮助你,这里有一个可能的实现,包括一个测试,看看a)是否用适当的参数调用Test2
和b)如果它的返回值被正确存储(再次,我不知道是什么你想让班级做,所以我只是提供一些例子):
function Test() {
var a = 5;
var b = 3;
this.result = this.Test2(a, b);
}
Test.prototype.Test2 = function(a, b) {
var result = a + b;
return result;
}
describe("1# Test Mocking", function () {
it("test: Mocking Example", function () {
spyOn(Test.prototype, 'Test2').and.returnValue(20);
var myMock = new Test();
expect(myMock.Test2.calls.argsFor(0)).toEqual([ 5, 3 ]);
expect(myMock.result).toEqual(20);
});
});