Javascript 茉莉花测试对象是否有某种方法
我正在使用Jasmine,我想测试一个对象是否有特定的方法,如下所示:Javascript 茉莉花测试对象是否有某种方法,javascript,coffeescript,jasmine,Javascript,Coffeescript,Jasmine,我正在使用Jasmine,我想测试一个对象是否有特定的方法,如下所示: it "should have 'open' method", -> @xhr = ajax.create() expect(@xhr).toHaveMethod "open" # I want to test like this! 我怎样才能测试?谢谢你的好意。我想试试: it "should have 'open' method", -> @xhr = ajax.create()
it "should have 'open' method", ->
@xhr = ajax.create()
expect(@xhr).toHaveMethod "open" # I want to test like this!
我怎样才能测试?谢谢你的好意。我想试试:
it "should have 'open' method", ->
@xhr = ajax.create()
expect(@xhr.open).toBeDefined()
请看此图。没有内置的方法,但您可以通过这样做来实现所需的结果
it "should have 'open' method", ->
@xhr = ajax.create()
expect(typeof @xhr.open).toBe("function")
请注意,如果测试被定义为在另一个答案中提出的,那么它将通过一些边缘情况,而不应该通过。如果采用以下结构,它将通过,并且它肯定不是一个函数
{ open : 1 }
@大卫答对了
tobedefine()
可能就是您想要的。但是,如果要验证它是函数而不是属性,则可以将toEqual()
与jasmine.any(函数)
一起使用。下面是一个示例:我尝试了这个解决方案,它很有效:
spyOn(@xhr,"open")
如果没有函数打开,它将抛出错误,因为它无法在它上启动间谍程序Jasmine允许您编写自己的“匹配程序”。文档对此进行了解释。 您可以编写一个非常特定的匹配器,名为
expect(obj).toHaveMethod("methodName");
就我个人而言,我会写一些更通用的东西来检查值类型。这样,我不仅可以使用它来检查是否在和对象/实例上定义了方法,还可以检查任何可以存储值的东西。它还允许我检查函数类型以外的类型
expect(obj.methodName).toBeA(Function);
要使其工作,您必须确保添加toBeA“matcher”
我是这样做的。角度示例:
beforeEach(inject(function ($injector) {
service = $injector.get("myService");
}));
it("should have myfunction function", function () {
expect(angular.isFunction(service.myfunction)).toBe(true);
});
此解决方案的问题是,如果预期失败,则消息将类似于
预期未定义为function
,这并没有多大帮助。类似于期望对象'@xhr'具有属性'open'
会更好。什么是“角度”?
beforeEach(inject(function ($injector) {
service = $injector.get("myService");
}));
it("should have myfunction function", function () {
expect(angular.isFunction(service.myfunction)).toBe(true);
});