【问题标题】:Unit testing promises in js-data-angular modelsjs-data-angular 模型中的单元测试承诺
【发布时间】:2015-05-11 19:00:40
【问题描述】:

我们在项目中使用js-datajs-data-angular

我有以下型号:

(function () {
  'use strict';
  angular.module('dash.models')
    .factory('Diagnosis', ['DS', function (DS) {
      function transform(resourcename, attrs, cb) {
        attrs.icd9codes.forEach(function (el) {
          delete el.add;
        });
        cb(null, attrs);
      }

      this.transform = transform;

      return DS.defineResource({
        name: 'diagnosis',
        idAttribute: 'id',
        endpoint: '/diagnosis',
        baseUrl: '/api',
        beforeCreate: transform,
        beforeUpdate: transform
      });
    }]);

}());

以及对所述模型的以下调用:

    var startEditing = self.startEditing = function(parentScope, diagnosis) {
      Diagnosis.findAll({
        deep:true
      }, {
        endpoint: '/diagnosis/' + diagnosis.id
      }).then(function(d) {
        $scope.diagnosis = d;
        $scope.inScope = true;
      });
    };

在我的单元测试中,我像这样模拟调用:

var diagDeferred = _$q_.defer();
    diagDeferred.resolve({
      'name': 'Breast',
      'categories': null,
      'id': '026c7cd0-14ef-4312-a8f1-2092107b0e50',
      'icd9codes': [{id: '1', code: '001', description: 'ICD9 Code'}]
    });

    spyOn(Diagnosis, 'findAll').and.returnValue(diagDeferred.promise);

实际调用是模拟的,没有被执行(我找不到任何关于如何完成此操作的可靠信息)是 Diagnosis.findAll.then 内的函数

我知道代码可以工作,但我需要用单元测试来覆盖它,我快干了。

谢谢。

【问题讨论】:

    标签: angularjs angular-promise jsdata js-data-angular


    【解决方案1】:

    我认为您在测试中忘记致电$scope.digest()。这是一个有效的fiddle

    在您调用startEditing() 之后,您应该调用$scope.$digest() 以便执行您的模拟promise,并且您可以在then 块中获取您的数据。希望对您有所帮助。

    【讨论】:

    • 这完全有效!我以为我过去曾尝试过,但它没有用,但它现在对我有用。非常感谢!
    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 2016-05-19
    相关资源
    最近更新 更多