我一直在尝试更改从我正在测试的方法中的提供程序返回方法的值。
我需要强制bdbPlatforms.isBrowser()
返回false
我知道可以调用spyOn()
方法并更改它返回的内容:
spyOn(bdbPlatforms, 'isBrowser').and.returnValue(false);
但显然没有开火,因为当我尝试:expect(bdbPlatforms.isBrowser()).toHaveBeenCalled();
它失败了。
测试用例如下所示:
describe('navigation provider: test', () => {
let navigation: NavigationProvider;
let navCtrlSpy;
let bdbPlatformsSpy;
beforeEach(() => {
navCtrlSpy = jasmine.createSpyObj('NavController', ['setRoot']);
bdbPlatformsSpy = jasmine.createSpyObj('BdbPlatformsProvider', ['isBrowser']);
});
afterEach(() => {
navCtrlSpy = null;
bdbPlatformsSpy = null;
});
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
NavigationProvider,
{
provide: BdbPlatformsProvider,
useClass: MockBdbPlatformsProvider
},
{
provide: ModalController,
useClass: ModalControllerMock
},
Platform
],
}).compileComponents();
navigation = TestBed.get(NavigationProvider);
});
it('should open Master page', () => {
navigation.platformSelect(navCtrlSpy);
expect(navCtrlSpy.setRoot).toHaveBeenCalledWith('MasterPage');
});
it('should open Tabs page', () => {
navigation.platformSelect(navCtrlSpy);
bdbPlatformsSpy.isBrowser.and.callFake(() => {
return false;
});
expect(navCtrlSpy.setRoot).toHaveBeenCalledWith('TabsPage');
});
});
这是测试类中的方法:
platformSelect() {
if(this.bdbPlatforms.isBrowser()){
this.navCtrl.setRoot('MasterPage');
} else {
this.navCtrl.setRoot('TabsPage');
}
}
测试失败并显示消息
使用['TabsPage']调用预期的间谍setRoot,但实际调用是['MasterPage']。
表示该值未在运行时更改。是否有可能在同一方法中间谍两次?如果不使用像callFake
这样的东西可能有用吗?
答案 0 :(得分:1)
spyOn(bdbPlatforms, 'isBrowser').and.callFake(function(){
return false;
});
说明:第一个参数是对象(如果有),第二个是spyOn的方法,然后回调只返回你想要返回的值(模拟值或预定义值)
https://jasmine.github.io/2.0/introduction.html#section-Spies
答案 1 :(得分:1)
您需要更正测试床中的BdbPlatformsProvider
条目。
尝试执行以下操作:
let bdbPlatformsSpy = jasmine.createSpyObj('BdbPlatformsProvider', ['isBrowser']);
bdbPlatformsSpy.isBrowser.and.callFake(function () {
return false;
});
TestBed.configureTestingModule({
declarations: [
..............
],
providers: [
..............
{
provide: BdbPlatformsProvider,
useValue: bdbPlatformsSpy
}
..............
],
imports: [
............
]
}).compileComponents();
}));
然后它应该工作。