[node.js] Sinon 오류 이미 래핑 된 함수를 래핑하려고했습니다.

여기에 같은 질문이 있지만 내 문제에 대한 답을 찾을 수 없으므로 여기에 내 질문이 있습니다.

mocha와 chai를 사용하여 노드 js 앱을 테스트하고 있습니다. 내 기능을 감싸기 위해 sinion을 사용하고 있습니다.

describe('App Functions', function(){

  let mockObj = sinon.stub(testApp, 'getObj', (dbUrl) => {
     //some stuff
  });
  it('get results',function(done) {
     testApp.someFun
  });
}

describe('App Errors', function(){

  let mockObj = sinon.stub(testApp, 'getObj', (dbUrl) => {
     //some stuff
  });
  it('throws errors',function(done) {
     testApp.someFun
  });
}

이 테스트를 실행하려고하면 오류가 발생합니다.

Attempted to wrap getObj which is already wrapped

나는 또한 넣어 보았습니다

beforeEach(function () {
  sandbox = sinon.sandbox.create();
});

afterEach(function () {
  sandbox.restore();
});

각 설명에서 여전히 동일한 오류가 발생합니다.



답변

getObjin after()기능을 복원해야 합니다. 아래와 같이 시도하십시오.

describe('App Functions', function(){
    var mockObj;
    before(function () {
            mockObj = sinon.stub(testApp, 'getObj', () => {
                 console.log('this is sinon test 1111');
            });
    });

    after(function () {
        testApp.getObj.restore(); // Unwraps the spy
    });

    it('get results',function(done) {
        testApp.getObj();
    });
});

describe('App Errors', function(){
    var mockObj;
    before(function () {
            mockObj = sinon.stub(testApp, 'getObj', () => {
                 console.log('this is sinon test 1111');
            });
    });

    after( function () {
        testApp.getObj.restore(); // Unwraps the spy
    });

    it('throws errors',function(done) {
         testApp.getObj();
    });
});


답변

이 오류는 스텁 기능을 제대로 복원하지 않았기 때문입니다. 샌드 박스를 사용한 다음 샌드 박스를 사용하여 스텁을 만듭니다. Suite 내부의 각 테스트 후 샌드 박스를 복원합니다.

  beforeEach(() => {
      sandbox = sinon.createSandbox();
      mockObj = sandbox.stub(testApp, 'getObj', fake_function)
  });

  afterEach(() => {
      sandbox.restore();
  });


답변

한 개체의 모든 방법을 복원해야하는 경우 sinon.restore(obj).

예:

before(() => {
    userRepositoryMock = sinon.stub(userRepository);
});

after(() => {
    sinon.restore(userRepository);
});


답변

나는 또한 Mocha의 before () 및 after () 후크를 사용하여 이것을 치고있었습니다. 나는 또한 모든 곳에서 언급했듯이 restore ()를 사용하고 있었다. 단일 테스트 파일은 정상적으로 실행되었지만 여러 개는 실행되지 않았습니다. 마지막으로 Mocha 루트 레벨 후크 에 대해 발견했습니다 . 따라서 루트 수준에서 before ()로 모든 파일을 찾고 테스트를 시작하기 전에 실행합니다.

따라서 유사한 패턴이 있는지 확인하십시오.

describe('my own describe', () => {
  before(() => {
    // setup stub code here
    sinon.stub(myObj, 'myFunc').callsFake(() => {
      return 'bla';
    });
  });
  after(() => {
    myObj.myFunc.restore();
  });
  it('Do some testing now', () => {
    expect(myObj.myFunc()).to.be.equal('bla');
  });
});


답변

‘beforeEach’에서 스텁을 초기화하고 ‘afterEach’에서 복원하는 것이 좋습니다. 그러나 모험심이 있다면 다음과 같은 효과도 있습니다.

describe('App Functions', function(){

  let mockObj = sinon.stub(testApp, 'getObj', (dbUrl) => {
     //some stuff
  });
  it('get results',function(done) {
     testApp.someFun
     mockObj .restore();
  });
}

describe('App Errors', function(){

  let mockObj = sinon.stub(testApp, 'getObj', (dbUrl) => {
     //some stuff
  });
  it('throws errors',function(done) {
     testApp.someFun
     mockObj .restore();
  });
}


답변

샌드 박스를 사용하더라도 오류가 발생할 수 있습니다. 특히 ES6 클래스에 대해 테스트가 병렬로 실행될 때.

const sb = sandbox.create();

before(() => {
  sb.stub(MyObj.prototype, 'myFunc').callsFake(() => {
    return 'whatever';
  });
});
after(() => {
  sb.restore();
});

다른 테스트가 프로토 타입에서 myFunc를 스텁하려고하면 동일한 오류가 발생할 수 있습니다. 고칠 수 있었지만 자랑스럽지 않습니다 …

const sb = sandbox.create();

before(() => {
  MyObj.prototype.myFunc = sb.stub().callsFake(() => {
    return 'whatever';
  });
});
after(() => {
  sb.restore();
});


답변

이 문제에 직면 한 모든 사람을 위해 전체 개체에 대해 스텁 또는 스파이를 수행하고 나중에

sandbox.restore ()

여전히 오류가 발생합니다. 개별 메서드를 스텁 / 스파이해야합니다.

나는 무엇이 잘못되었는지 알아 내려고 영원히 낭비했다.

sinon-7.5.0