2011-08-07 6 views
2

ジャスミンでファイルアクセスをテストするのに問題があります。私はrequire('fs').watchでコールバックを登録し、ファイルの名前を含むイベントを出すシンプルなウォッチャーを書いています。jasmineとnode.jsでファイルシステムを偽装する

しかし、私がfsモジュールをモックするテストを書くとき、いくつかの問題があります。ここで

は私のウォッチャークラス(先のCoffeeScript)

class Watcher extends EventEmitter 
    constructor: -> 
    @files = [] 

    watch: (filename) -> 
    if !path.existsSync filename 
     throw "File does not exist." 
    @files.push(filename) 
    fs.watchFile filename, (current, previous) -> 
     this.emit('file_changed') 

そして、ここで私のテストです:

it 'should check if the file exists', -> 
    spyOn(path, 'existsSync').andReturn(true) 
    watcher.watch 'existing_file.js' 
    expect(path.existsSync).toHaveBeenCalledWith 'existing_file.js' 

この1つがうまく機能し、問題なく通るが、この1つは完全に失敗し、私は私が正しく引数を渡しているかどうかはわかりません。

it 'should throw an exception if file doesn\'t exists', -> 
    spyOn(path, 'existsSync').andReturn(false) 
    expect(watcher.watch, 'undefined_file.js').toThrow() 
    expect(path.existsSync).toHaveBeenCalledWith 'undefined_file.js' 

そして最後の1つは私には奇妙なものです([オブジェクト]にはメソッドがありません)。これは間違っています。第二の問題については

it 'should emit an event when a file changes', -> 
    spyOn(fs, 'watchFile').andCallFake (file, callback) -> 
    setTimeout(-> 
     callback {mtime: 10}, {mtime: 5} 
    , 100) 
    spyOn(path, 'existsSync').andReturn(true) 
    watcher.watch 'existing_file.js' 
    waits 500 
    expect(watcher.emit).toHaveBeenCalledWith('file_changed') 

は、私はちょうど閉鎖で私の関数呼び出しをラップし、それが働いていたが、私は本当に私のテストを実行するときに、 thisコンテキストが完全に台無しにされた理由を理解する必要があります。

答えて

2

は、私はあなたがする必要があると思うthis question

を参照してください:

テスト定義の期間中に対立するものとして期待マッチャは、実際のテスト実行時に呼び出すことができます匿名関数を定義し
expect(-> watcher.watch 'undefined_file.js').toThrow 'File does not exist.' 

2番目の問題については、任意の機能ではなく、ジャスミンスパイオブジェクトでtoHaveBeenCalledにしかコールできません。あなただけの

spyOn(watcher, 'emit').andCallThrough() 

をやって機能をラップすることができますが、ファイルシステムのモックのためmemfsを使用することができますthe jasmine API docs on Spy.andCallThrough()

+0

ええ、ありがとう、私は最初の問題を解決する方法を考え出しました。あなたのソリューションはよりシンプルに見え、魅力のように機能します。 –

0

を参照してください。

関連する問題