Тестирование Angular Сервиса с заглушками - PullRequest
2 голосов
/ 07 апреля 2020

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

My DataStorageService - это служба для экстраполяции хранилища. используемый. Например, LocalStorage, No SQL, et c. все можно использовать, но мой основной код будет продолжать вызывать DAtaStorageService. Я просто изменяю реализацию, чтобы использовать любой модуль, который мне нужен, или их комбинацию.

Это пример блока из настройки теста.

const BadData:Observable<ITestInterface> = of<ITestInterface>( { Key_: 'Bad', Name: 'Bad Record for Testing' } );
const GoodData:Observable<ITestInterface> = of<ITestInterface>( { Key_: 'Good', Name: 'Good Record for Testing' } );
const NoKey:Observable<ITestInterface> = of<ITestInterface>( { Name: 'Missing Key for Testing' } );

describe('DataStorage Service - Mocked AngularFire Responses', () => {
    let ServiceUnderTest:DataStorage<ITestInterface>;
    let DependentService:AngularFireDatabase;

    const ObjectStub = {
        valueChanges: jasmine.createSpy('valueChanges').and.returnValue(GoodData)
    };

    const AfDbStub = {
        object: jasmine.createSpy('object').and.returnValue(ObjectStub)
    };

    afterEach(() => {
        DependentService = null;
        ServiceUnderTest = null;
    });

    beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [
                DataStorage,
                { provide: AngularFireDatabase, useValue:AfDbStub }
            ]
        });
        DependentService = TestBed.inject(AngularFireDatabase);
        ServiceUnderTest = TestBed.inject(DataStorage);
    });

Вопрос, который у меня возникает, заключается в том, как продолжайте настраивать заглушку, которая будет возвращена. Я пишу тесты для обработки успешных возвратов, отрицательных возвратов и т. Д. c. Однако, как я вижу при построении заглушек, возвращающих значение, все они кажутся однопроходными, если только вы не настроите первый возврат, второй возврат, а затем третий и т. Д. c.

В образец добавлен один сервис, но в нем есть только одна заглушка из сервиса AngularFire, с которой мой код может работать. Таким образом, мне нужно сделать этот полный блок для каждого из трех различных тестов. Есть ли способ сделать это без 3-х различных блоков описания? Я знаю, что мог бы установить это, чтобы получить 3 возврата для первого вызова, второго вызова и затем третьего вызова, и каждый тест совершает соответствующее количество вызовов, однако это не кажется правильным.

Однако, так как я хочу протестировать успех, неудачу, пропущенные данные, это единственное средство, которое возвращает данные в указанном порядке, означает, что мои тесты должны выполняться в таком порядке, что означает, что они не являются действительно независимыми. Правильно ли это, или я делаю что-то, например, просто возвращаю различные настройки, и проверка на отрицательный вызов сделает первый вызов, чтобы получить положительный результат, затем второй вызов в том же тесте, чтобы он возвратил ошибку и проверил, что результат?

РЕДАКТИРОВАТЬ: Я также считаю, что мои шпионы / заглушки не настроены правильно для работы с базовым Angularfire. У меня все еще вопрос о заменах, но, может быть, шпионы могли бы быть установлены с функциями в возврате, чтобы позволить мне проверить переменную и вернуть хорошее, плохое или ошибку?

1 Ответ

2 голосов
/ 08 апреля 2020

В случае тестирования услуг, я предпочитаю что-то вроде этого:

{ provide: AngularFireDatabase, useValue: {} } // simple empty object

Тогда в каждом тесте вы можете использовать функцию spyOn, чтобы смоделировать какой-то результат, например:

it('success', () => {
  spy = jasmine.spyOn(dependentService, 'method').andReturn(42);

  expect(service.method()).toEqual(...);
  expect(spy).toHaveBeenCalled();
});

В этом случае вы можете легко манипулировать поведением зависимой службы в другом тестовом сценарии.

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