Pierce through Javascript closures and access private symbols
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 .