Pure Angular directive unit test.

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/mocha/1.12.1/mocha.js"></script>
<script src="http://code.angularjs.org/1.1.5/angular.js"></script>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/mocha/1.12.1/mocha.css">
<script src="http://chaijs.com/chai.js"></script>
<!-- We are going to use Mocha + Chai setup for testing -->
<script>
    mocha.setup('bdd');
</script>
<body>
    <div id="mocha"></div>
</body>
<!-- Adding angular mocks to have 'module' and 'inject' functions -->
<script src="http://code.angularjs.org/1.1.5/angular-mocks.js"></script>

CoffeeScript

angular.module 'myModule', []

angular.module('myModule').directive 'clickOff', ->
  restrict : 'A',
    scope: {
        'xxx': '='
    },
  link     : (scope, element, attrs) ->
    isOff = true
        
    angular.element(document.body).bind 'click', ->
      if isOff
        scope.$eval attrs.clickOff
        scope.$digest()
      isOff = true

    element.bind 'click', -> 
      isOff = false
      return

{expect} = chai
    
HTML = """
	<div click-off="test()"></div>
"""
    
describe "click off directive jqLite test", ->
  $compile = null
  $elem    = null
  scope    = null
  
  beforeEach module "myModule"
  
  beforeEach inject ($injector, $rootScope) ->  
    scope = $rootScope.$new()
    scope.didFire = null
    scope.test = ->
      scope.didFire = true

    $compile = $injector.get "$compile"
    $elem    = $compile(HTML)(scope)

  it "click on element should not fire expression", ->
    expect(scope.didFire).to.be.null
    $elem.triggerHandler "click"
    angular.element(document.body).triggerHandler "click"
    expect(scope.didFire).to.be.null

  it "click off the elemnt should fire expression", ->
    expect(scope.didFire).to.be.null
    angular.element(document.body).triggerHandler "click"
    expect(scope.didFire).to.be.true

  it "clicking on and off", ->
    $elem.triggerHandler "click"
    angular.element(document.body).triggerHandler "click"
    expect(scope.didFire).to.be.null
    angular.element(document.body).triggerHandler "click"
    expect(scope.didFire).to.be.true
    scope.didFire = false
    $elem.triggerHandler "click"
    angular.element(document.body).triggerHandler "click"
    expect(scope.didFire).to.be.false
    angular.element(document.body).triggerHandler "click"
    expect(scope.didFire).to.be.true
    
mocha.run()