Я пытался изменить значение, которое возвращает метод от поставщика внутри метода, который я тестирую.
Мне нужно заставить 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');
}
}
Тест не пройден с сообщением
Ожидается, что шпион setRoot будет вызван с помощью ['TabsPage'], но фактические вызовы были ['MasterPage'].
, что означает, что значение не изменяется во время выполнения. Можно ли шпионить дважды одним и тем же способом? если не использовать что-то вроде callFake
может работать?