用于测试对象是否具有某种方法的Jasmine

时间:2013-03-28 07:30:41

标签: javascript coffeescript jasmine

我正在使用Jasmine,我想测试一个对象是否有某种方法,如下所示:

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

我该如何测试?谢谢你的好意。

6 个答案:

答案 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