Edit in JSFiddle

describe('uiDate', function() {
  
  // chargement du module
  beforeEach(module("myApp"));

  // vérification de l'affection de la date provenant du modèle au datepicker
  it('should be able to get the date from the model', function() {
    // injection du service $compile et du $rootScope
    return inject(function($compile, $rootScope) {
      // création d'un scope fils
      var scope = $rootScope.$new();
      // creation d'une date pour test
      var aDate = new Date(2012, 6, 10);
      // compilation de la directive
      var element = $compile("<input ui-date ng-model='x'></input>")(scope);
      // affectation de la date de test au scope
      scope.$apply(function() {
        return scope.x = aDate;
      });
      // test si le datepicker affiche bien la date de test
      return expect(element.datepicker('getDate')).toEqual(aDate);
    });
  });

  // vérification de l'affectation de la date sélectionnée dans le datepicker dans le modèle
  it('should put the date in the model', function() {
    // injection du service $compile et du $rootScope
    return inject(function($compile, $rootScope) {
      // création d'un scope fils
      var scope = $rootScope.$new();
      // creation d'une date pour test
      var aDate = new Date(2012, 6, 10);
      // compilation de la directive
      var element = $compile("<input ui-date ng-model='x'></input>")(scope);
      // simulation d'une sélection dans le datepicker
      element.datepicker('setDate', aDate);
      $.datepicker._selectDate(element);
      // vérification que le modèle contient bien la date de test
      return expect(scope.x).toEqual(aDate);
    });
  });
    
});

var myApp = angular.module('myApp', []);

myApp.directive('uiDate', function() {
    return {
      require: '?ngModel',
      link: function($scope, element, attrs, controller) {
        var originalRender, updateModel, usersOnSelectHandler;
        if ($scope.uiDate == null) $scope.uiDate = {};
        if (controller != null) {
          updateModel = function(value, picker) {
            return $scope.$apply(function() {
              return controller.$setViewValue(element.datepicker("getDate"));
            });
          };
          if ($scope.uiDate.onSelect != null) {
            usersOnSelectHandler = $scope.uiDate.onSelect;
            $scope.uiDate.onSelect = function(value, picker) {
              updateModel(value);
              return usersOnSelectHandler(value, picker);
            };
          } else {
            $scope.uiDate.onSelect = updateModel;
          }
          originalRender = controller.$render;
          controller.$render = function() {
            originalRender();
            return element.datepicker("setDate", controller.$viewValue);
          };
        }
        return element.datepicker($scope.uiDate);
      }
    };
  });

// KICK OFF JASMINE
var jasmineEnv = jasmine.getEnv();
var trivialReporter = new jasmine.TrivialReporter();

jasmineEnv.addReporter(trivialReporter);

jasmineEnv.specFilter = function(spec) {
    return trivialReporter.specFilter(spec);
};

jasmineEnv.execute();