2017-07-01 37 views
0

我正在测试取决于用户操作的模态行为,模态结果可以返回多个选项。更改提供服务值以测试不同情况

基于的代码如下:

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。要开始测试了这一点,我只是通过angular.mock.module注入module并通过$uibModal服务$provide嘲笑的期望:

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

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

这肯定将返回redirecttrue并呼吁redirectToBrowseIfReverted,但我想测试的情况下,这是false但我不知道如何在特定的UT案例中告诉角度,以替代$provide服务$uibModal并返回false。任何帮助将非常感激。

回答

1

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

如果是茉莉花,您可以利用间谍(请参阅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> 
}); 

道歉不es6ing它,但希望你得到jist。 :)

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

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 }) 
    }); 
}); 

由于间谍只能执行一次执行策略,因此需要最后一个执行策略。这有点哈克,但它的工作原理。

+0

谢谢队友!我正在使用'spyOn',但效果不好,我在监视服务而不是控制器的'范围': 'spyOn($ uibModal,'open')。and.returnValue({result:$ q。 resolve({redirect:false})});'而不是'spyOn(controller。$ uibModal,'open').and.returnValue({result:$ q.resolve({redirect:false})});' 毕竟我在构造函数上设置了模态服务,使其在控制器范围内可用: '构造函数($ uibModal,$ rootScope,$ scope,$ timeout,$ q){ this。$ uibModal = $ uibModal; ...' 感谢您的解决方案! – Enot

相关问题