茉莉花测试多个间谍

时间:2014-02-18 10:51:33

标签: javascript angularjs unit-testing jasmine

我正在为Angular应用程序编写一些测试,这是我第一次尝试使用Jasmine进行Angular的单元测试。我无法构建测试以满足函数内部的各种场景(即if语句和回调)。

这是我的$ scope函数,它将Object作为参数,如果该对象有id,则它更新对象(因为它已经存在),否则它会创建一个新的报告,使用CRUD服务推送到后端。

$scope.saveReport = function (report) {
  if (report.id) {
    CRUD.update(report, function (data) {
      Notify.success($scope, 'Report updated!');
    });
  } else {
    CRUD.create(report, function (data) {
      $scope.report = data;
      Notify.success($scope, 'Report successfully created!');
    });
  }
};

到目前为止,我的测试传递了一个带有id的伪对象,因此它会触发CRUD.update方法,然后我会调用该方法。

describe('$scope.saveReport', function () {
  var reports, testReport;
  beforeEach(function () {
    testReport = {
      "id": "123456789",
      "name": "test"
    };
    spyOn(CRUD, 'update');
    $scope.saveReport(testReport);
  });
  it('should call CRUD factory and update', function () {
    expect(CRUD.update).toHaveBeenCalledWith(testReport, jasmine.any(Function));
  });
});

我理解Jasmine不允许多个间谍,但我希望能够以某种方式测试if条件,并在Object 传递给Object时运行模拟测试太:

describe('$scope.saveReport', function () {
  var reports, testReport;
  beforeEach(function () {
    testReport = {
      "id": "123456789",
      "name": "test"
    };
    testReportNoId = {
      "name": "test"
    };
    spyOn(CRUD, 'update');
    spyOn(CRUD, 'create'); // TEST FOR CREATE (NoId)
    spyOn(Notify, 'success');
    $scope.saveReport(testReport);
    $scope.saveReport(testReportNoId); // TEST FOR NO ID
  });
  it('should call CRUD factory and update', function () {
    expect(CRUD.update).toHaveBeenCalledWith(testReport, jasmine.any(Function));
    // UNSURE ON THIS PART TOO
  });
});

我已经阅读了有关使用.andCallFake()方法的内容,但我看不出这对我的设置有何影响。任何帮助真的很感激。

1 个答案:

答案 0 :(得分:1)

您似乎应该首先确定需要测试的内容。如果你想简单地测试当id存在时调用更新,或者在没有id时调用create,那么你应该只使用这些条件构造it函数。对于某些事情来说,之前的每个人都是错误的地方。

it('should call CRUD factory and update', function () {
    spyOn(CRUD, 'update');
    $scope.saveReport(testReport);
    expect(CRUD.update).toHaveBeenCalledWith(testReport, jasmine.any(Function));
});
it('should call CRUD create', function() {
    spyOn(CRUD, 'create');
    $scope.saveReport(testReportNoId); // TEST FOR NO ID
    expect(CRUD.create).toHaveBeenCalledWith(testReport, jasmine.any(Function));
});

在每次测试之前,只需将事物放在每个实际应该做的事情之前。

希望这有帮助!