ジャスミンを使用したファイル アクセスのテストに問題があります。require('fs').watch
コールバックを登録し、ファイルの名前を含むイベントを発行する単純なウォッチャーを作成していますが、ここでは特別なものはありません。
fs
ただし、モジュールをモックするテストを作成しようとすると、いくつかの問題が発生します。
これが私のWatcherクラスです(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'
これはうまく機能し、問題なく通過しますが、これは完全に失敗します。引数を正しく渡しているかどうかはわかりません。
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'
そして最後のものは私に奇妙な '([Object] does not have a method emit)' を与えますが、これは間違っています。
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 番目の問題については、関数呼び出しをクロージャーでラップしただけで機能しましたが、テストを実行するときにコンテキストが完全にめちゃくちゃになる理由を本当に理解する必要があります。