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()