2013-03-28 36 views
21

我用的茉莉,我想测试一个对象是否具有一定的方法还是不行,象下面这样:茉莉花来测试对象是否具有一定的方法或不

it "should have 'open' method", -> 
    @xhr = ajax.create() 
    expect(@xhr).toHaveMethod "open" # I want to test like this! 

如何测试?谢谢你的好心。

回答

24

有没有内置的方式来做到这一点,但你可以做到这一点,达到预期的效果。

it "should have 'open' method", -> 
    @xhr = ajax.create() 
    expect(typeof @xhr.open).toBe("function") 

请注意,测试如果它定义为对方的回答提出了具有一定优势的情况下它会通过,它不应该。如果你采取以下结构,它会通过,它绝对不是一个功能。

{ open : 1 } 
+0

这种解决方案的问题是,如果预期失败,消息会像'预期不确定要function',这是不是所有的帮助。像'预期对象'@xhr'有财产'打开'会更好。 – Jorn 2015-07-21 11:19:01

11

我会尝试:

it "should have 'open' method", -> 
    @xhr = ajax.create() 
    expect(@xhr.open).toBeDefined() 

看到这个fiddle

24

@david回答正确。 toBeDefined()可能是你想要的。然而,如果你想验证它是一个功能,而不是一个属性,那么你可以使用toEqual()jasmine.any(Function)。这里有一个例子:http://jsbin.com/eREYACe/1/edit

-1

我试过这个解决方案,它的工作原理:

spyOn(@xhr,"open") 

如果没有功能打开,它会抛出错误,因为它不能在它

0

茉莉花启动spyig允许您编写自己的“匹配器”。文档解释它。 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; 
    } 
    }; 
} 
2

我是这样做的。角例如:

beforeEach(inject(function ($injector) { 
    service = $injector.get("myService");  
})); 

it("should have myfunction function", function() { 
    expect(angular.isFunction(service.myfunction)).toBe(true); 
});