我正在使用 Jasmine,我想测试一个对象是否具有某种方法,如下所示:
it "should have 'open' method", ->
@xhr = ajax.create()
expect(@xhr).toHaveMethod "open" # I want to test like this!
我该如何测试?谢谢你的好心。
我正在使用 Jasmine,我想测试一个对象是否具有某种方法,如下所示:
it "should have 'open' method", ->
@xhr = ajax.create()
expect(@xhr).toHaveMethod "open" # I want to test like this!
我该如何测试?谢谢你的好心。
@david 回答正确。toBeDefined()
可能是你想要的。但是,如果您想验证它是一个函数而不是一个属性,那么您可以使用toEqual()
with jasmine.any(Function)
。这是一个例子:http: //jsbin.com/eREYACe/1/edit
没有内置的方法可以做到这一点,但您可以通过这样做来获得所需的结果。
it "should have 'open' method", ->
@xhr = ajax.create()
expect(typeof @xhr.open).toBe("function")
请注意,测试是否按照其他答案中的建议进行了定义,在某些极端情况下它会通过,但不应该通过。如果你采取以下结构,它会通过,它绝对不是一个函数。
{ open : 1 }
我会尝试:
it "should have 'open' method", ->
@xhr = ajax.create()
expect(@xhr.open).toBeDefined()
看到这个小提琴。
我是这样做的。角度示例:
beforeEach(inject(function ($injector) {
service = $injector.get("myService");
}));
it("should have myfunction function", function () {
expect(angular.isFunction(service.myfunction)).toBe(true);
});
Jasmine 允许您编写自己的“匹配器”。文档对此进行了解释。 http://jasmine.github.io/2.0/custom_matcher.html
您可以编写一个非常具体的匹配器,称为
expect(obj).toHaveMethod("methodName");
就我个人而言,我会写一些更通用的东西来检查值类型。这样,我不仅可以使用它来检查是否在对象/实例上定义了方法,还可以检查任何可以存储值的东西。它还使我可以检查函数类型以外的类型。
expect(obj.methodName).toBeA(Function);
要让它工作,你必须确保添加 toBeA “匹配器”。
beforeEach(function(){
jasmine.addMatchers({
toBeA: toBeA
});
});
function toBeA() {
return {
compare: function (value, type) {
var result = {pass: val != null && val.constructor === type || val instanceof type};
if (result.pass) {
result.message = 'Expected ' + value + ' to be a ' + type.name
} else {
result.message = 'Expected ' + value + ' to not be a ' + type.name
}
return result;
}
};
}
我尝试了这个解决方案并且它有效:
spyOn(@xhr,"open")
如果没有打开函数,它会抛出错误,因为它不能在上面启动 spyig