0

私は現在、https://github.com/felixge/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);
      });
    });
  });
});

サンドボックス化されたモジュールに関する次のテストは失敗します。

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

Object コンストラクターを提供して、プロトタイプの should の隠しプロパティが利用可能であることを確認しようとしましたが、それも機能しませんでした。

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

面白いことに、 https://github.com/nathanmacinnes/injectrのような同様のサンドボックス モジュールを使用すると、同じ問題が発生します。これは、ここで誰が何か間違ったことをしているのかについて私を混乱させます.node-sandboxed-moduleとinjectrの両方、ノード自体、should.js、それとも私ですか? :)

助けてくれてありがとう。

4

2 に答える 2

0

別の解決策は、テスト モジュール内でオブジェクトを作成することです。そのため、Object.prototype modified byshouldが使用されます。例えば:

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

この複製手法では、オブジェクトのメンバー関数が失われることに注意してください。

于 2013-11-20T07:31:36.513 に答える