При выполнении следующего кода с использованием Mocha оба этих теста дают ошибку.

Первое возвращение:

«перед каждым« крючком для »следует проверить использование jQuery.getJSON jQuery.ajax» TypeError: Попытка обернуть ajax, который уже обернут

Второй возвращает просто неудачный тест:

AssertError: ожидал, что ajax будет вызван один раз, но был вызван 0 раз


var sinonAssert = require('@sinonjs/referee').assert;
var chaiAssert = require("chai").assert;

function makeCall(){
    $.ajax({
        method: "POST",
        url: "some.php",
        data: { name: "John", location: "Boston" },
        dataType: "application/json"
      })
        .done(function( msg ) {
          alert( "Data Saved: " + msg );
        });
}
describe('wrapping a function in a spy', function() {
    beforeEach(function() {        
        sinon.spy(jQuery, "ajax");
    });
    afterEach(function() {
        sinon.restore();
    });
    it("should inspect jQuery.getJSON's usage of jQuery.ajax", function(){        
        jQuery.getJSON("/some/resource");
        sinonAssert(jQuery.ajax.calledOnce);
        chaiAssert.strictEqual("/some/resource", jQuery.ajax.getCall(0).args[0].url);
        chaiAssert.strictEqual("json", jQuery.ajax.getCall(0).args[0].dataType);
    });
});
describe('makeCall', function() {
    const spy = sinon.spy(jQuery, "ajax");
    beforeEach(function() {
        makeCall();
    });
    afterEach(function() {
        sinon.restore();
    });
    it("should make only one ajax call", function(){
        sinon.assert.callCount(spy, 1);
    });
});

Я ожидаю, что запуск sinon.restore(); после каждого теста приведет к развертыванию объекта jQuery. Интересно, что когда я добавляю отдельные песочницы, второй тест проходит:

var sinonAssert = require('@sinonjs/referee').assert;
var chaiAssert = require("chai").assert;
var sandbox = require('sinon').createSandbox();
var sandbox2 = require('sinon').createSandbox();

function makeCall(){
    $.ajax({
        method: "POST",
        url: "some.php",
        data: { name: "John", location: "Boston" },
        dataType: "application/json"
      })
        .done(function( msg ) {
          alert( "Data Saved: " + msg );
        });
}
describe('wrapping a function in a spy', function() {
    beforeEach(function() {        
        sandbox.spy(jQuery, "ajax");
    });
    afterEach(function() {
        sandbox.restore();
    });
    it("should inspect jQuery.getJSON's usage of jQuery.ajax", function(){        
        jQuery.getJSON("/some/resource");
        sinonAssert(jQuery.ajax.calledOnce);
        chaiAssert.strictEqual("/some/resource", jQuery.ajax.getCall(0).args[0].url);
        chaiAssert.strictEqual("json", jQuery.ajax.getCall(0).args[0].dataType);
    });
});
describe('makeCall', function() {
    const spy = sandbox2.spy(jQuery, "ajax");
    beforeEach(function() {
        makeCall();
    });
    afterEach(function() {
        sandbox2.restore();
    });
    it("should make only one ajax call", function(){
        sandbox2.assert.callCount(spy, 1);
    });
});

Почему объект jQuery остается завернутым после теста?

0
zumafra