我正在测试模态行为,根据用户操作,模态的结果可以返回多个选项。
基于代码如下:
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;
});
因此,根据重定向是真还是假,它会调用redirectToBrowseIfReverted
或redirectToSaveTarget
。要开始对此进行测试,我只需通过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
。任何帮助都将非常感激。
答案 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,但它确实有效。