【问题标题】:Sinon JS "Attempted to wrap ajax which is already wrapped"Sinon JS“试图包装已经包装的ajax”
【发布时间】:2012-02-08 04:45:45
【问题描述】:

我在运行测试时收到上述错误消息。下面是我的代码(我使用 Backbone JS 和 Jasmine 进行测试)。有谁知道为什么会这样?

$(function() {
  describe("Category", function() {
     beforeEach(function() {
      category = new Category;
      sinon.spy(jQuery, "ajax");
     }

     it("should fetch notes", function() {
      category.set({code: 123});
      category.fetchNotes();
      expect(category.trigger).toHaveBeenCalled();
     }
  })
}

【问题讨论】:

    标签: testing backbone.js jasmine sinon


    【解决方案1】:

    您必须在每次测试后移除间谍。看看 sinon 文档中的示例:

    {
        setUp: function () {
            sinon.spy(jQuery, "ajax");
        },
    
        tearDown: function () {
            jQuery.ajax.restore(); // Unwraps the spy
        },
    
        "test should inspect jQuery.getJSON's usage of jQuery.ajax": function () {
            jQuery.getJSON("/some/resource");
    
            assert(jQuery.ajax.calledOnce);
            assertEquals("/some/resource", jQuery.ajax.getCall(0).args[0].url);
            assertEquals("json", jQuery.ajax.getCall(0).args[0].dataType);
        }
    }
    

    所以你的茉莉花测试应该是这样的:

    $(function() {
      describe("Category", function() {
         beforeEach(function() {
          category = new Category;
          sinon.spy(jQuery, "ajax");
         }
    
         afterEach(function () {
            jQuery.ajax.restore();
         });
    
         it("should fetch notes", function() {
          category.set({code: 123});
          category.fetchNotes();
          expect(category.trigger).toHaveBeenCalled();
         }
      })
    }
    

    【讨论】:

    • 在我的一次试验中,我也有一个 afterEach 块,但它并没有解决问题。可能是因为我把 afterEeach 放在所有测试之后而不是放在 beforeEach 之后?
    • 我想是的,因为 beforeEachafterEach 是函数调用,就像你的测试一样。所以在你所有的测试之后调用afterEach 将没有任何效果。
    • process.exit.restore(); ...不错
    • 2019...只需将此函数添加到描述块中:afterEach(function () { jQuery.ajax.restore(); });或 afterEach(function () { $.ajax.restore(); });这取决于您对 jQuery 的导入。我们经常写“import * as $ from ...”
    • 仍然面临这个问题,感谢我的同事在他的测试用例中留下了这个漏洞。关闭后工作。
    【解决方案2】:

    一开始你需要的是:

      before ->
        sandbox = sinon.sandbox.create()
    
      afterEach ->
        sandbox.restore()
    

    然后调用类似:

    windowSpy = sandbox.spy windowService, 'scroll'
    
    • 请注意我使用的是咖啡脚本。

    【讨论】:

    • 除非开放式或未指定,否则答案应使用问题所在的语言。
    • @JustinJohnson 我认为 JS 和咖啡脚本之间没有任何误解。顺便说一句,它们是相同的语言。
    • 你的经历和提问者的经历不一样,你不应该假设他们是一样的。 CoffeeScript 将语法糖添加到 JavaScript(您在此处使用),因此它们是一回事。
    • afterEach 并致电sandbox.restore() 加一
    猜你喜欢
    • 2016-07-04
    • 2019-09-22
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多