If you are writing any amount of Javascript, you are probably using closures to hide local state, e.g. to have private methods.
In tests you may find it necessary to inspect a variable that is hidden behind a closure, or to mock a private method using Jasmine spies Show archive.org snapshot .
You can use the attached Knife
helper to punch a hole into your closure, through which you can read, write or mock local symbols:
klass = (->
privateVariable = 0
privateMethod = ->
privateVariable += 1
publicMethod = ->
privateMethod()
add: add
knife: eval(Knife.point)
)()
klass.knife.get('privateVariable') => 0
klass.knife.set('privateCounter', 5)
klass.knife.get('privateCounter') => 5
spy = klass.knife.mock('privateMethod').and.returnValue("mocked!")
klass.publicMethod() # => 'mocked!'
expect(spy).toHaveBeenCalled()
If you don't like Knife but have a similar use case you can also go thermonuclear with metafunction Show archive.org snapshot .
Posted by Henning Koch to makandra dev (2015-07-29 17:31)