24

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

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

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

4

6 回答 6

31

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

于 2013-09-10T14:28:04.573 回答
25

没有内置的方法可以做到这一点,但您可以通过这样做来获得所需的结果。

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

请注意,测试是否按照其他答案中的建议进行了定义,在某些极端情况下它会通过,但不应该通过。如果你采取以下结构,它会通过,它绝对不是一个函数。

{ open : 1 }
于 2013-03-28T14:52:08.970 回答
11

我会尝试:

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

看到这个小提琴

于 2013-03-28T08:09:01.573 回答
2

我是这样做的。角度示例:

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

it("should have myfunction function", function () {
    expect(angular.isFunction(service.myfunction)).toBe(true);
});
于 2016-09-20T09:14:18.950 回答
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;
    }
  };
}
于 2016-05-01T19:00:41.303 回答
-1

我尝试了这个解决方案并且它有效:

spyOn(@xhr,"open")

如果没有打开函数,它会抛出错误,因为它不能在上面启动 spyig

于 2015-09-09T15:24:23.533 回答