我已经创建了一个完整的简化示例,它复制了我遇到的问题。
function TestObj() {
var self = this;
self.getStuff = function(aString, callback) {
// TODO
}
}
describe("server communications", function() {
it("it calls the server", function() {
var obj = new TestObj();
obj.getStuff = jasmine.createSpy();
// swap the above line for this and it makes no difference
// spyOn(obj, "getStuff");
var functionVar = function() {
};
obj.getStuff("hello", functionVar);
expect(obj.getStuff).toHaveBeenCalledWith(
[ "hello", jasmine.any(Function) ]);
});
});
我得到的不是通过的单元测试,而是以下输出:
预期spy已被调用:[[ 'hello', ]],但被调用的是:[ 'hello',Function ]
为什么它没有意识到我传入的函数(function (){})实际上是函数?它所期望的本机代码是什么?还有谁在使用jasmine.any(函数)时遇到了这个问题?谢谢!
编辑的
我尝试使用spyOn而不是jasmine.createSpy(),结果没有什么不同。我只尝试了一个论点,它是有效的。引入第一个字符串参数会破坏jasmine.any(函数)--有什么想法吗?
发布于 2012-05-17 08:50:35
啊,我还以为你必须把expect().toHaveBeenCalledWith
的参数包含在Array[]
中呢。我真傻。以下是一个工作版本:
function TestObj() {
var self = this;
self.getStuff = function(aString, callback) {
// TODO
}
}
describe("server communications", function() {
it("it calls the server", function() {
var obj = new TestObj();
obj.getStuff = jasmine.createSpy();
// swap the above line for this and it makes no difference
// spyOn(obj, "getStuff");
var functionVar = function() {
};
obj.getStuff("hello", functionVar);
expect(obj.getStuff).toHaveBeenCalledWith("hello", jasmine.any(Function));
});
});
发布于 2012-05-16 16:46:29
问题是你创建间谍的方式,使用spyOn
似乎可以像预期的那样工作:
describe("test", function() {
return it("is function", function() {
var a = {b: function(){}};
spyOn(a, 'b');
a.b(function(){});
expect(a.b).toHaveBeenCalledWith(jasmine.any(Function));
});
});
您还可以使用write your own Matcher来测试传递的值是否为函数:
describe('test',function(){
it('is function',function(){
this.addMatchers({
isFunction: function() {
return typeof this.actual === 'function';
}
});
expect(function(){}).isFunction();
});
});
编辑:对第一个代码块进行了编码
https://stackoverflow.com/questions/10610874
复制相似问题