여기에 같은 질문이 있지만 내 문제에 대한 답을 찾을 수 없으므로 여기에 내 질문이 있습니다.
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();
});
각 설명에서 여전히 동일한 오류가 발생합니다.
답변
getObj
in 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