Jasmine 测试一个对象是不是有某种方法

Posted

技术标签:

【中文标题】Jasmine 测试一个对象是不是有某种方法【英文标题】:Jasmine to test whether a object has a certain method or notJasmine 测试一个对象是否有某种方法 【发布时间】:2013-03-18 13:40:58 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

我会尝试:

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

看到这个fiddle。

【讨论】:

【参考方案2】:

没有内置的方法可以做到这一点,但您可以通过这样做来达到预期的效果。

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

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

 open : 1 

【讨论】:

这个解决方案的问题是,如果期望失败,消息将类似于Expected undefined to be function,这并不是那么有用。像Expected object '@xhr' to have property 'open' 这样的东西会更好。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

spyOn(@xhr,"open")

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

【讨论】:

【参考方案5】:

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;
    
  ;

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

什么是“角”?

以上是关于Jasmine 测试一个对象是不是有某种方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jasmine 单元测试中使用 Sinon 对 jQuery 动画进行假时间?

使用jasmine.SpyObj-Angular / Jasmine测试服务属性上的可观察对象

如何对 DOM 操作进行单元测试(使用 jasmine)

如何在不使用 Angular 的 spyOn 的情况下检查服务中的方法是不是在 Jasmine 单元测试中被调用?

Angular Jasmine单元测试。类型错误:this.sitesTable.renderRows不是一个函数。

Spec没有期待——Jasmine测试回调函数