2013-04-26 3 views
0

현재 단위 테스트에서 종속성 모의 (mock)를 주입 할 수 있도록 https://github.com/felixge/node-sandboxed-module을 실험하고 있습니다.node-sandboxed-module 및 should.js가 함께 작동하지 않습니까?

myModule.js :

module.exports = { 
    func1: function() { 
    return { 
     'THIS': { 
     'IS': { 
      'SPARTA': { 
      'DONT': 'TRUST ME' 
      } 
     } 
     } 
    }; 
    } 
}; 

인 MyModule-test.js : 약

var should = require('should'); 
var sandboxedModule = require('sandboxed-module'); 
var myModule1 = require('./myModule'); 
var myModule2 = sandboxedModule.require('./myModule'); 

describe('myModule', function() { 
    it('should return the object', function() { 
    myModule1.func1().should.be.instanceOf(Object); 
    }); 

describe('returned object', function() { 
    it('should have the correct properties', function() { 
     myModule1.func1().THIS.should.have.property('IS'); 
    }); 
    }); 
}); 

describe('Sandboxed myModule', function() { 
    describe('returned object', function() { 
    it('should have the should property', function() { 
     should.exist(myModule2.func1().should); 
    }); 

    describe('nested objects', function() { 
     it('should have the should property', function() { 
     should.exist(myModule2.func1().THIS.should); 
     should.exist(myModule2.func1().THIS.IS.should); 
     }); 
    }); 
    }); 
}); 

이 테스트 밝혀이 모듈은 샌드 박스 모듈에서 생성 된 개체에 대한 should.js 사망 샌드 박스 처리 된 모듈에 오류가 발생했습니다.

1) Sandboxed myModule returned object should have the should property: 
    AssertionError: expected undefined to exist 
2) Sandboxed myModule returned object nested objects should have the should property: 
    AssertionError: expected undefined to exist 

나는 객체 생성자를 사용하여 shoul 프로토 타입 D의 숨겨진 재산을 사용할 수 있지만, 그 작업 중 하나를하지 않았다 :

var myModule2 = sandboxedModule.require('./myModule', { 
    globals: { 
    Object: Object 
    } 
}); 

재미있는 것은 내가 https://github.com/nathanmacinnes/injectr처럼 비슷한 샌드 박스 - 모듈을 사용하는 경우 같은 문제가 발생합니다. 이것은 내가 누가 노드 - 샌드 박스 - 모듈과 인젝터, 노드 자체, should.js, 아니면 나조차도 무엇인가 잘못하고있는 사람에 대해 혼란 스럽다. :)

도움 주셔서 감사합니다.

답변

1

노드/V8 문제인 것처럼 보입니다. node.js docs에 따르면, Object.prototype에 새로운 컨텍스트로 제공 할 수 없습니다

중요한 문제는 V8 직접 컨텍스트 내에서 사용되는 전역 객체를 제어 할 수있는 방법을 제공하지 않는다는 점입니다 알고 있어야. 따라서 샌드 박스 객체의 속성을 컨텍스트에서 사용할 수 있지만 샌드 박스 프로토 타입의 모든 속성을 사용할 수 없을 수도 있습니다.

그래서 해결 방법을 찾아야합니다. .should 속성을 사용하지 않고 object.prop1.should.equal(value); 대신 (object.prop1 === value).should.equal(true); 같은 것을하거나 단순히 Object.prototype을 확장하지 않는 asserting lib를 사용하는 것을 피할 수 있습니다.

0

대체 솔루션은 테스트 모듈 내에 객체를 생성하는 것이므로 should으로 수정 된 Object.prototype이 사용됩니다. 예를 들어 :

var clone = function(obj){ 
    return JSON.parse(JSON.stringify(obj)); 
} 

var orig_objForTest = sandboxedModule.func(); //does not have .should property 
var objForTest = clone(orig_objForTest); //has .should property 

이 복제 기술은 객체의 멤버 함수를 잃는 것을 명심