Sha256: 2f442f9aab044625cbb62a423fcc796008c6949bd3b3b453a81b353e0042dff7

Contents?: true

Size: 1.37 KB

Versions: 3

Compression:

Stored size: 1.37 KB

Contents

##
# Knife: Get, set or mock inaccessible variables in a JavaScript closure
# ======================================================================
#
# Requires [Jasmine](http://jasmine.github.io/) 2+.
#
# Usage:
#
#     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()
#
@Knife = (->

  contextBleeder = ->

    get = (symbol) ->
      eval(symbol)

    set = (symbol, value) ->
      eval("#{symbol} = value")

    mock = (symbol) ->
      oldImpl = get(symbol)
      spy = jasmine.createSpy(symbol)
      set(symbol, spy)
      cleaner = -> set(symbol, oldImpl)
      Knife.cleaners.push(cleaner)
      spy

    get: get
    set: set
    mock: mock

  reset = ->
    cleaner() while cleaner = Knife.cleaners.pop()

  me = {}
  me.reset = reset
  me.cleaners = []

  if jasmine?
    me.point = "(#{contextBleeder.toString()})()"
    # Jasmine defines afterEach on window
    afterEach reset
  else
    me.point = "undefined"

  me

)()

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
unpoly-rails-0.34.0 spec_app/spec/javascripts/helpers/knife.js.coffee
unpoly-rails-0.33.0 spec_app/spec/javascripts/helpers/knife.js.coffee
unpoly-rails-0.32.0 spec_app/spec/javascripts/helpers/knife.js.coffee