变更提供服务价值以测试不同的案例

时间:2017-07-01 22:42:39

标签: angularjs unit-testing mocking

我正在测试模态行为,根据用户操作,模态的结果可以返回多个选项。

基于代码如下:

const modalInstance = this.$uibModal.open({
      animation: true,
      resolve: {},
      component: 'modalView',
      size: 'lg'
    });
    let dismissed = false;
    modalInstance.result.then((result) => {
      if (result.redirect) { 
        this.redirectToBrowseIfReverted();
      } else {
        this.redirectToSaveTarget();
      }
    },
    () => {
      dismissed = true;
    });

因此,根据重定向是真还是假,它会调用redirectToBrowseIfRevertedredirectToSaveTarget。要开始对此进行测试,我只需通过module注入angular.mock.module并将$uibModal服务传递给$provide以根据需要进行模拟:

let mockModal = () => ({
  open: () => {
    return { result: $q.resolve({ redirect: true }) };
 }
});

beforeEach(() => {
 angular.mock.module(moduleName, $provide => {
 $provide.service('$uibModal', mockModal);
});

这肯定会将redirect值作为true返回并调用redirectToBrowseIfReverted但我想在false时测试这个案例,但我不知道如何判断在特定UT情况下的角度,以覆盖$provide的{​​{1}}服务并返回$uibModal。任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:2)

不幸的是,你没有提到你正在使用的测试框架。

如果是Jasmine,您可以利用间谍(请参阅https://jasmine.github.io/2.0/introduction.html#section-Spies)动态更改返回的值。

您必须将服务注入您的测试中,如下所示:

var $uibModal;
var $q

beforeEach(angular.mock.inject(function(_$uibModal_, _$q_) {
  $uibModal = _$uibModal_;
  $q = _$q_;
}));

然后你可以在测试中使用间谍:

it('should return redirect as true', function() {
  spyOn($uibModal, 'open').and.returnValue({
    result: $q.resolve({ redirect: true })
  });
  <the rest of your test>
});

it('should return redirect as false', function() {
  spyOn($uibModal, 'open').and.returnValue({
    result: $q.resolve({ redirect: false })
  });
  <the rest of your test>
});

抱歉没有意见,但希望你得到了这个主意。 :)

编辑:此外,如果你有很多测试,并且你担心在每次测试中都有间谍,你可以做这样的事情只测试一次失败案例:

var $uibModal;
var $q;
var modalSpy;

beforeEach(angular.mock.inject(function(_$uibModal_, _$q_) {
  $uibModal = _$uibModal_;
  $q = _$q_;
  modalSpy = spyOn($uibModal, 'open').and.returnValue({
    result: $q.resolve({ redirect: true })
  });
}));

it('returns false for this one test only', function() {
  modalSpy.and.returnValue({
    result: $q.resolve({ redirect: false })
  });
});

由于间谍只能拥有一个执行策略,所以需要最后一个。它有点hacky,但它确实有效。