jquery - Jasmine 在 click() 之后测试 ajax 请求

标签 jquery ajax testing click jasmine

我正在尝试使用 jasmine 在点击事件后测试 ajax 调用。我尝试了很多不同的方法来让点击被识别,但无法让 ajax 触发。

这是我的测试文件:

# use require to load any .js file available to the asset pipeline
#= require jquery
#= require jquery_ujs
#= require jquery.ui.all
#= require jquery.scrollTo.min
#= require application/save_search

setUpHTMLFixture = ->
  loadFixtures "home_page"

describe "save_search", ->
  beforeEach ->
    setUpHTMLFixture()

  it "should get the list of friends and insert it in the page", ->
    print $("#save-search")
    spyOn jQuery, "ajax"
    $("#save-search").click()
    print $("#save-search")
    jQuery.ajax.mostRecentCall.args[0].success "Something"
    expect($("#save-search").length).toBe 2

我的代码:

jQuery ->

  $("#save-search").click ->
    draggables = undefined
    draggables = {}
    jQuery.each jQuery(".ui-draggable"), (index, draggable) ->
      child = undefined
      parentId = undefined
      classes = undefined
      left = undefined
      offset = undefined
      top = undefined
      value = undefined
      draggable = jQuery(this)
      parentId = draggable.parent().attr("id")
      child = draggable.children()
      value = child.val()
      classes = draggable.attr("class").replace(/ui-draggable|down|cloner|\s/g, "")
      key = classes + index
      offset = draggable.offset()
      left = offset.left
      top = offset.top
      draggables[key] =
        value: value
        left: left
        top: top
        parent_id: parentId

    draggables["name"] = $("#search-name").val()

    $.ajax
      type: "POST"
      url: "/searches/save_search"
      data:
        draggables: JSON.stringify(draggables)

      dataType: "json"
      success: (msg) ->
        alert "Data Saved: " + msg

      false

我的固定装置:

<a id="save-search">Save Search</a>

<div class="ui-draggable">some stuff</div>

<div class="ui-draggable">some stuff</div>

最佳答案

问题是您将事件绑定(bind)到脚本运行时不存在的元素,因为它将在 setUpHTMLFixture 可以创建 html 之前运行。您必须重构您的代码,以便您可以在测试中调用一个函数,该函数将在创建夹具后添加绑定(bind)。

window.addEvent = ->
  $("#save-search").click ->
    draggables = undefined
    draggables = {}
    jQuery.each jQuery(".ui-draggable"), (index, draggable) ->
      child = undefined
      parentId = undefined
      classes = undefined
      left = undefined
      offset = undefined
      top = undefined
      value = undefined
      draggable = jQuery(this)
      parentId = draggable.parent().attr("id")
      child = draggable.children()
      value = child.val()
      classes = draggable.attr("class").replace(/ui-draggable|down|cloner|\s/g, "")
      key = classes + index
      offset = draggable.offset()
      left = offset.left
      top = offset.top
      draggables[key] =
        value: value
        left: left
        top: top
        parent_id: parentId

    draggables["name"] = $("#search-name").val()

    $.ajax
      type: "POST"
      url: "/searches/save_search"
      data:
        draggables: JSON.stringify(draggables)

      dataType: "json"
      success: (msg) ->
        alert "Data Saved: " + msg

      false

jQuery ->  addEvent

在你的测试中

setUpHTMLFixture = ->
  loadFixtures "home_page"

describe "save_search", ->
  beforeEach ->
    setUpHTMLFixture()

  it "should get the list of friends and insert it in the page", ->
    addEvent()
    print $("#save-search")
    spyOn jQuery, "ajax"
    $("#save-search").click()
    print $("#save-search")
    jQuery.ajax.mostRecentCall.args[0].success "Something"
    expect($("#save-search").length).toBe 2

关于jquery - Jasmine 在 click() 之后测试 ajax 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18364475/

相关文章:

javascript - 使用 ajax 时如何在 jQuery/JavaScript 中制作重定向页面?

javascript - XMLhttprequest.send() 不向 PHP 发送变量

javascript - 将变量从 AJAX 发送到 PHP 时出错

testing - 开发人员与测试人员的最佳比例是多少?

javascript - 如何在 Cypress 中测试以某种形状的对象作为参数调用的 stub 函数?

jQuery 菜单不会滑动

javascript - 如何将分割后的整数值分配给 el 的某些子项?

javascript - 循环遍历表格并根据选中的复选框更改 <tr> 背景

ajax - Zend_Acl 用于页面的特定部分

ruby-on-rails - 我想在 a/post 尝试设置数据库模型的 id 时呈现一条 json 消息