0

我正在使用 Jasmine jQuery 测试自定义 javascript 模块的 AJAX 请求,最终它是对 DOM 的后处理操作,但我的 Jasmine 测试没有找到新操作的元素。

茉莉花测试如下...

describe("#init", function() {
  it("should return a JSON object from the server", function() {
    loadFixtures("top_content_container.html");

    // This method will add 'div.search_result' to the 'div.top_content' container
    SC.init();

    expect($('div.top_content')).toContain('div.top_content_container');
    expect($('div.top_content')).toContain('div.search_results');

   // THIS TEST SHOULD PASS, BUT DOES NOT DETECT THE DOM UPDATES AND DOES NOT
   expect($('div.top_content div.search_result').length == 10).toBeTruthy();
  });
});

在该SC.init()方法中,它将元素添加到 DOM,然后运行 ​​AJAX 请求,该请求返回数据并将其注入 DOM。这些新创建的元素匹配“div.search_result”。

我已经确认所有 AJAX 请求都在正常运行,并且 SC 库正在正确地将所有元素注入 DOM;从功能的角度来看,该库正在运行。问题是如何让 Jasmine 测试来查看 DOM 的更新。同样,我不需要帮助调试 SC 代码库;我需要帮助调试测试本身。

你看到有什么不正常的地方吗?

4

2 回答 2

1

AJAX 是异步的,因此您的 Jasmine 规范可能会在 AJAX 请求收到响应之前达到关于搜索结果的断言。您可能希望jasmine.Ajax.useMock()在调用之前执行一次SC.init(),然后将成功响应传递给它。为此,您需要Jasmine-Ajax

于 2012-09-23T06:44:00.583 回答
0

https://github.com/velesin/jasmine-jquery这样的库会给你更多的权力。但是,粗略的解决方案也可以使用 runs/waitsFor 进行异步查询。

 it("should load asynchronously", function() {

     runs(function() {
        $el = $('<div id="jasmine-insert">').appendTo('body');
        $el.load('path/file.html');
      });
      waitsFor(
        function() {  return $el.html().length > 0; }, // tested at intervals
        "html couldn't be loaded", // message on error
        500); // wait time out
      runs(function() {
        expect($('div.top_content').find('div.top_content_container').toEqual(1));
      });

  });
于 2012-09-29T01:38:52.527 回答