2017-07-18 12 views
1

NodeJSコアからfsでreadFileSyncをスタブすることができないようです。次のコードは問題を特定します。以下にモカの結果を介してテストを実行する:Proxyquire:スタブできませんfs.readFileSync

> mocha tests/test.js 

     Some description 
     1) "before all" hook 


     0 passing (15ms) 
     1 failing 

     1) Some description "before all" hook: 
     TypeError: Cannot read property 'charCodeAt' of undefined 
      at Object.stripBOM (internal/module.js:48:14) 
      at Object.require.extensions.(anonymous function) (node_modules/proxyquire/lib/proxyquire.js:276:43) 
      at Proxyquire._withoutCache (node_modules/proxyquire/lib/proxyquire.js:179:12) 
      at Proxyquire.load (node_modules/proxyquire/lib/proxyquire.js:136:15) 
      at Context.<anonymous> (tests/test.js:12:15) 

はここでテスト/ test.js

var proxyquire = require('proxyquire'), 
    sinon = require('sinon'), 
    fs = require('fs'), 
    sut; 

describe('Some description', function() { 
    var readFileSyncStub; 

    before(function() { 
     readFileSyncStub = sinon.stub(fs, 'readFileSync'); 
     readFileSyncStub.withArgs('someFile.js', { encoding: 'utf8' }).returns('some text'); 
     sut = proxyquire('../sut', { fs: { readFileSync: readFileSyncStub } }); // Exception encountered somewhere in here ... 
    }); 

    after(function() { 
     fs.readFileSync.restore(); // This is executed ... 
    }); 

    it('Some it', function() { 
     // This never happens ... 
    }); 
}); 

だし、ここで、モジュールがテストされているsut.js、です:

var fs = require('fs'); // The code in this file is never executed ... 

module.exports = function() { 
    return fs.readFileSync('someFile.js', { encoding: 'utf8' }); 
}; 

プロジェクトのフォルダ構造は次のとおりです。

./sut.js 
./package.json 
./tests/test.js 
プロンプトから mocha tests/test.jsを実行すると、

test.jsを実行できます。

私は数年前、Githubに似たようなことが報告されていたことに気がつきましたが、同じ問題か別の問題かは分かりません。ここにリンクがあります:それは助け

https://github.com/thlorenz/proxyquire/issues/12

場合、これらは私のpackage.jsonファイルで依存関係があります。私はproxyquireの依存関係に似たようなバージョンを使ってみました:

{ 
    ... 
    "devDependencies": { 
    "jshint": "^2.9.5", 
    "jslint": "^0.11.0", 
    "mocha": "~3.1", 
    "proxyquire": "^1.8.0", 
    "sinon": "~1.9" 
    }, 
    "dependencies": {} 
    ... 
} 

何か助けがありがとう!あなたはそれを交換するproxyquireを使用してもをしている場合(実際にはrequire()proxyquireの両方を壊しているため、fs.readFileSync()はあなたの問題を引き起こしているスタブ、)

答えて

2

あなたはfs.readFileSync()をスタブする必要はありません。素晴らしい作品

describe('Some description', function() { 
    var readFileSyncStub; 

    before(function() { 
    readFileSyncStub = sinon.stub() 
          .withArgs('someFile.js', { encoding: 'utf8' }) 
          .returns('some text'); 
    sut = proxyquire('../sut', { fs : { readFileSync : readFileSyncStub } });       
    }); 

    it('Some it', function() { 
    let value = sut(); 
    assert.equal(value, 'some text'); 
    }); 

}); 
+0

ありがとう@robertklep、:

はこれを試してみてください!私は少し混乱しています。 Githubの例では、fs:https://github.com/thlorenz/proxyquire/blob/master/examples/sinon/foo-tests.jsのメソッドをスタブしています。 – Andrew

+1

@Andrewこれらの例は古いです(その特定のファイルでは5年です)。その間、Node.js内部が変更されたと思います。単に 'fs.readFileSync()'をスタブするだけで、最近のNode.jsのバージョンでは事が壊れてしまいます。 – robertklep

関連する問題