2017-02-12 11 views
0

私はファイルを読み込み、ファイルの内容を使って約束を返します。mocha、chai、chaiAsPromisedとSinonとのjs約束事をテストする

function fileContents(){ 
    return new Promise(function(resolve, reject) { 
    fs.readFile(filename, function(err, data){ 
     if (err) { reject(err); } 
     else { resolve(data); } 
    }); 
    }); 
} 

上記

describe('Testing fileContents', function() { 

afterEach(function() { 
    fs.readFile.restore(); 
}); 

it('should return the contents of the fallBack file', function() { 
    let fileContents = '<div class="some-class">some text</div>'; 

    sinon.stub(fs, 'readFile').returns(function(path, callback) { 
     callback(null, fileContents); 
    }); 

    let fileContentsPromise = fileContents(); 

    return fileContentsPromise 
     .then(data => { 
     expect(data).to.eventually.equal(fileContents); 
     }); 

}); 

のユニットテストは、上記の試験は

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. 

とERRS Iはまた

describe('Testing fileContents', function() { 

    afterEach(function() { 
    fs.readFile.restore(); 
    }); 

    it('should return the contents of the fallBack file', function (done) { 
    let fileContents = '<div class="some-class">some text</div>'; 

    sinon.stub(fs, 'readFile').returns(function(path, callback) { 
     callback(null, fileContents); 
    }); 

    let fileContentsPromise = fileContents(); 

    fileContentsPromise.then(function(data){ 
    expect(data).to.equal(fileContents); 
    done(); 
    }); 
}); 

を試み、同じエラーを得ました。この機能は私のローカルサイトで動作していますが、テストの書き方はわかりません。私はjsが初めてです。私は何が欠けていますか?

答えて

1

コードに複数の問題があります。たとえば、テストでfileContentsを再宣言して文字列値を割り当てますが、同じテストでfileContents()を実行することはできません。私は、このような "恐怖"型の間違いではなく、2つの概念的な問題に集中するつもりです。

2概念的な問題は次のとおりである:あなたが.yieldsを使用する必要があり、偽の値を使用してコールバックを呼び出すfs.readFile持って

  1. .returnsを使用すると、使用しない戻り値が変更されます。したがって、このようにそれをスタブ:

    sinon.stub(fs, 'readFile').yields(null, fakeContents); 
    
  2. あなたは非約束をchai-as-promisedによって提供さ.eventually機能を使用していますが、あなたは、あなたのテストをする必要がありますので、それが正しく動作するための約束でそれを使用する必要があります。

    return expect(fileContentsPromise).to.eventually.equal(fakeContents); 
    

ここで動作するコードです:

const sinon = require("sinon"); 
const fs = require("fs"); 
const chai = require("chai"); 
const chaiAsPromised = require("chai-as-promised"); 
chai.use(chaiAsPromised); 

const expect = chai.expect; 

// We need to have filename defined somewhere... 
const filename = "foo"; 
function fileContents(){ 
    return new Promise(function(resolve, reject) { 
    fs.readFile(filename, function(err, data){ 
     if (err) { reject(err); } 
     else { resolve(data); } 
    }); 
    }); 
} 

describe('Testing fileContents', function() { 

    afterEach(function() { 
     fs.readFile.restore(); 
    }); 

    it('should return the contents of the fallBack file', function() { 
     let fakeContents = '<div class="some-class">some text</div>'; 

     sinon.stub(fs, 'readFile').yields(null, fakeContents); 

     let fileContentsPromise = fileContents(); 

     return expect(fileContentsPromise).to.eventually.equal(fakeContents); 
    }); 
}); 
+0

収量が正確に何をされるI探していた、ありがとう。私の元のコードではない変数名を持つ赤いニシンの謝罪。より一般的なコードに変更し、「偽のコンテンツ」と関数名に同じ名前を使用していることに気付かなかった。とにかく、もう一度ありがとう! – margo

関連する問題