Как выполнить модульное тестирование (некомпонентного) класса поддержки в Angular с помощью фиктивного сервиса - PullRequest
0 голосов
/ 30 марта 2020

Я не могу понять, как выполнить модульное тестирование некоторых методов класса поддержки в Angular с помощью Jasmine. Тестируемый класс представляет собой одноэлементный, простой класс машинописного текста, который инициализируется одной из служб при запуске, а затем используется различными компонентами в течение жизненного цикла приложений путем вызова AccountsManager.getInstance().

. конструктор и инициализатор для этого класса, называемый AccountsManager:

export class AccountsManager {
    private static instance: AccountsManager;

    static initialize(accountService: AccountService) {
        if (!this.instance) { this.instance = new AccountsManager(accountService) }

    }

    static getInstance(): AccountsManager {
        if (!this.instance || !this.instance.isInitialized) {
            throw new Error("AccountsManager.getInstance(): AccountManager has not been initialized");
        }
        return this.instance;
    }

    //methods...
 }

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

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

Я нашел пример того, как протестировать компонент с помощью фиктивной службы, но я предполагаю, что они являются неправильной установкой для тестирования POT C.

В любом случае, вот что я попробовал, просто чтобы посмотреть.

fdescribe('AccountsManager', () => {

    let fixture: ComponentFixture<AccountsManager>
    let mockAccountService = {  }
    let component : AccountsManager;
    beforeEach(() =>{
        TestBed.configureTestingModule({
            declarations: [AccountsManager],
            providers: [{provide: AccountService, useValue:  mockAccountService}]
        })
        fixture= TestBed.createComponent(AccountsManager);
        component = fixture.componentInstance;
    })
});

Я предполагаю, что это никогда не сработает, так как "AccountsManager" - это просто класс, а не компонент Angular, но в любом случае он теперь не работает TestBed.createComponent(AccountsManager) с сообщением об ошибке, что конструктор AccountsManager является закрытым (по замыслу), и createComponent ожидает, что будет конструктор publi c. Но я предполагаю, что в любом случае есть более простой способ сделать то, что я хочу.

Если все, что я хочу сделать, это иметь возможность инициализировать этот класс с помощью фиктивного экземпляра AccountsService, какой самый простой способ сделать это, чтобы я мог выполнять свои тесты?

1 Ответ

0 голосов
/ 30 марта 2020

Если я получил то, что вы просите, вам нужно что-то вроде этого:

describe('AccountsManager', () => {
    let mockAccountService = {};
    let accountsManager: AccountsManager;

    beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [{provide: AccountService, useValue:  mockAccountService}]
        });

        AccountsManager.initialize(TestBed.inject(AccountService));
        accountsManager = AccountsManager.getInstance();
    });

    it('should be a singleton', () => {
       AccountsManager.initialize(TestBed.inject(AccountService));
       const am = AccountsManager.getInstance();

       expect(am === accountsManager)
         .withContext('AccountsManager is not a singleton')
         .toBeTrue();
    });
});
...