Модульный тест не пройден после добавления нового теста - PullRequest
0 голосов
/ 30 августа 2018

В настоящее время я работаю над приложением Ionic (v3), и у нас есть несколько тестов для тестирования сервисов, страниц и компонентов.

Все работало нормально, пока я не добавил новый тест для компонента.

Оба теста работают нормально по отдельности (если они начинаются с fdescribe или если я прокомментирую один из них).

Тесты выглядят так:

VERIFY-key.spec.ts

describe('Component: VerifyKey', () => {

  let component: VerifyKeyComponent
  let fixture: ComponentFixture<VerifyKeyComponent>

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [VerifyKeyComponent],
      imports: [
        IonicModule.forRoot(VerifyKeyComponent)
      ]
    })

    // create component and test fixture
    fixture = TestBed.createComponent(VerifyKeyComponent)

    // get test component from the fixture
    component = fixture.componentInstance
  })
  ...
})

кошелек-Select-coins.spec.ts

describe('Wallet-Select-Coin Component', () => {

  let fixture: ComponentFixture<WalletSelectCoinsPage>
  let component: WalletSelectCoinsPage

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [WalletSelectCoinsPage],
      imports: [
        IonicModule.forRoot(WalletSelectCoinsPage),
        ComponentsModule,
        IonicStorageModule.forRoot({
          name: '__airgap_storage',
          driverOrder: ['localstorage']
        })
      ],
      providers: [
        SecretsProvider,
        {
          provide: SecureStorageService,
          useFactory: SecureStorageFactory,
          deps: [Platform]
        },
        { provide: NavController, useClass: NavControllerMock },
        { provide: NavParams, useClass: NavParamsMock },
        { provide: StatusBar, useClass: StatusBarMock },
        { provide: SplashScreen, useClass: SplashScreenMock },
        { provide: Platform, useClass: PlatformMock }
      ]
    })
  }))

  beforeEach(() => {
    fixture = TestBed.createComponent(WalletSelectCoinsPage)
    component = fixture.componentInstance
    fixture.detectChanges()
  })

  it('should not show hd-wallet dropdown if currency does not support it', () => {
    let el = fixture.debugElement.nativeElement
    let ethereumRadio = el.querySelector('#eth')

    // click on ethereum
    ethereumRadio.click()
    fixture.detectChanges()
    console.log(component.selectedProtocol)
    expect(component.selectedProtocol).toBeDefined() // This fails
    expect(component.selectedProtocol.identifier).toEqual('eth')

    // eth should not show hd wallets
    let hdWalletSelector = el.querySelector('#wallet-type-selector')
    expect(hdWalletSelector).toBeFalsy()
  })

})

Если оба теста включены, второй сбой в строке expect(component.selectedProtocol).toBeDefined() с ошибкой Expected undefined to be defined.

Если я закомментирую строку fixture = TestBed.createComponent(VerifyKeyComponent) из первого файла, то второй тест запустится без проблем.

Моей первой идеей было то, что TestBed каким-то образом модифицируется в первом тесте. Поэтому я попытался добавить TestBed.resetTestingModule() после первого теста, но это ничего не изменило.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 31 августа 2018

При написании тестов рекомендуется очищать все после каждого теста, чтобы все тесты могли выполняться в произвольном порядке, не затрагивая другие тесты.

Я бы предложил вводить afterEach() или afterAll() в каждом тесте, который очищает все полученные данные. Поскольку большинство тестовых сред запускают все тесты в одном контексте.

И почему вы хотите, чтобы ваш TestBed.configureTestingModule был создан async ()? Ваш тест будет выполнен, но асинхронная часть, вероятно, никогда не будет вызвана до it(..

Надеюсь, эти идеи помогут:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...