我正在使用Jasmine,我想测试一个对象是否有某种方法,如下所示:
it "should have 'open' method", ->
@xhr = ajax.create()
expect(@xhr).toHaveMethod "open" # I want to test like this!
我该如何测试?谢谢你的好意。
答案 0 :(得分:26)
@david正确回答。 toBeDefined()
可能就是你想要的。但是,如果您要验证它是函数而不是属性,那么您可以将toEqual()
与jasmine.any(Function)
一起使用。以下是一个示例:http://jsbin.com/eREYACe/1/edit
答案 1 :(得分:24)
没有内置的方法可以做到这一点,但你可以通过这样做来达到预期的效果。
it "should have 'open' method", ->
@xhr = ajax.create()
expect(typeof @xhr.open).toBe("function")
请注意,测试是否在其他答案中定义为已定义为具有一些边缘情况,它将通过,而不应该通过。如果你采用以下结构,它将通过,它绝对不是一个函数。
{ open : 1 }
答案 2 :(得分:11)
我会尝试:
it "should have 'open' method", ->
@xhr = ajax.create()
expect(@xhr.open).toBeDefined()
请参阅此fiddle。
答案 3 :(得分:2)
FBSDKLoginButton *fbLoginButton = [[FBSDKLoginButton alloc] init];
fbLoginButton.center = self.view.center;
fbLoginButton.readPermissions = @[@"public_profile", @"email", @"user_friends"];
[self.view addSubview:fbLoginButton];
答案 4 :(得分:0)
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;
}
};
}
答案 5 :(得分:-1)
我尝试了这个解决方案并且有效:
spyOn(@xhr,"open")
如果没有打开功能,它会抛出错误,因为它无法启动spyig