首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Jasmine中监视JQuery选择器

在Jasmine中监视JQuery选择器
EN

Stack Overflow用户
提问于 2011-03-17 17:57:46
回答 6查看 47.6K关注 0票数 62

我正在使用Jasmine对一些JavaScript进行单元测试,并希望侦测(模拟)由jQuery选择器访问的DOM元素。

我的规格是:

代码语言:javascript
复制
it("should be able to mock DOM call", function() {

    spyOn($("#Something"), 'val').andReturn("bar");

    result = $("#Something").val();

    expect(result).toEqual("bar");

});

在我的specrunner.html中,我有:

代码语言:javascript
复制
<input type="hidden" id="Something" value="foo" />

不幸的是,该规范失败了,原因是:

应该能够模拟DOM调用,期望'foo‘等于’bar‘。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-06-01 16:11:02

这一行是错误的:

代码语言:javascript
复制
spyOn($("#Something"), 'val').andReturn("bar");

Jasmine的spyOn函数需要两个参数。第一个是现有的对象。第二个是字符串形式的函数名。您正确地将函数名作为字符串("val")传入,但没有将现有对象作为第一个参数传入。

代码语言:javascript
复制
$("#Something")

...is不是现有对象。它是jQuery选择器的结果(返回值)。更具体地说,它将返回一个表示匹配节点的jQuery对象-有点像一个结果数组。

代码语言:javascript
复制
$

对现有对象执行...is操作。

代码语言:javascript
复制
$.fn

对现有对象执行...is操作。

代码语言:javascript
复制
$("#Something")

...is 不是现有对象-它是jQuery选择器的结果。

这将会起作用:

代码语言:javascript
复制
it("should be able to mock DOM call", function () {
    //spyOn($.fn, "val").andReturn("bar"); //pre-jasmine 2.0 syntax
    spyOn($.fn, "val").and.returnValue("bar"); //Jasmine 2.0 Syntax
    var result = $("#Something").val();
    expect(result).toEqual("bar");
});
票数 96
EN

Stack Overflow用户

发布于 2011-11-21 04:45:02

似乎我找到了很好的解决方案

代码语言:javascript
复制
    it "should open past statuses", ->
      # We can't use $('.past') here cause each time $('.past') called it returns different objects
      # so we need to store spy in variable
      showSpy = spyOn($.fn, 'show')
      # do the stuff
      $('.show-past').click()
      # then check if 'show' action was called
      expect($.fn.show).toHaveBeenCalled()
      # and if it realy our object
      expect(showSpy.mostRecentCall.object.selector).toEqual('.past')

这不是基于你的代码,但我希望这能帮助到一些人。还有,是的,CoffeScript中的例子。

票数 27
EN

Stack Overflow用户

发布于 2011-03-23 13:34:02

问题是,对$的两个调用返回两个不同的jQuery包装的节点。

这应该是可行的:

代码语言:javascript
复制
it("should be able to mock DOM call", function(){

  // var node = $("Something");
  // spyOn(node, 'val').andReturn('bar');

  // expect(node.val()).toEqual('bar');
  var node = $("Something");
  spyOn(node, 'val').and.returnValue('bar');

  expect(node.val()).toEqual('bar');
});

下一次,帮助在Jasmine邮件列表中更加流行: jasmine-js@googlegroups.com。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5337481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档