我在使用 jasmine 测试我的文件访问时遇到问题。我正在编写一个简单的观察程序,它注册一个回调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'
最后一个给了我奇怪的“([对象]没有方法发射)”,这是错误的。
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
上下文完全搞砸了。