Как подсмотреть внутренний метод и вернуть желаемое значение? - PullRequest
0 голосов
/ 27 апреля 2018

Я пытался изменить значение, которое возвращает метод от поставщика внутри метода, который я тестирую.

Мне нужно заставить 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 может работать?

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Вам необходимо исправить BdbPlatformsProvider запись в Test Bed. Попробуйте сделать следующее:

1. Создать шпиона bdbPlatforms.

    let bdbPlatformsSpy = jasmine.createSpyObj('BdbPlatformsProvider', ['isBrowser']);
    bdbPlatformsSpy.isBrowser.and.callFake(function () {
        return false;
    });


2. Добавьте запись в испытательный стенд, как показано ниже:

TestBed.configureTestingModule({

      declarations: [
        ..............
      ],

      providers: [
        ..............

        {
          provide: BdbPlatformsProvider,
          useValue: bdbPlatformsSpy
        }
        ..............
      ],

      imports: [
        ............
      ]

    }).compileComponents();

  }));


Тогда это должно сработать.

0 голосов
/ 05 мая 2018
spyOn(bdbPlatforms, 'isBrowser').and.callFake(function(){
    return false;
});

Объяснение: первый параметр - это объект, если таковой имеется, второй - метод spyOn, затем обратный вызов просто возвращает любое значение, которое вы хотите вернуть (смоделированное значение или предопределенное значение)

https://jasmine.github.io/2.0/introduction.html#section-Spies

...