Aurelia: агрегатор событий для юнит-тестирования

Как разработчик Angular (2), я недавно начал экспериментировать с Aurelia. Кстати, очень нравится... Но у меня действительно есть некоторые трудности с юнит-тестированием Аурелии. Event Aggregator, Это то, что у меня есть в данный момент, но оно не запускает событие в моем контроллере прямо сейчас. Я сейчас делаю это неправильно, какая-то помощь будет отличной!

// app.js

@inject(UserService, EventAggregator)
export class App {
    constructor(userService, eventAggregator) {
        this.userService = userService;
        this.eventAggregator = eventAggregator;
        this.authorizedUser = null;

        // get authorized user
        this.getAuthorizedUser();

        // subscribe to events
        this.eventAggregator.subscribe(EVENTS.USER_LOGGED_IN, data => {
            this.authorizedUser = data;
        });
    }

    // calls userService and sets this.authorizedUser;
    getAuthorizedUser() {
        ....
    }
 }

И моя спецификация в настоящее время выглядит так:

describe('app', () => {
    let component,
        createComponent,
        eventAggregator = new EventAggregator(),
        userService = new UserService();

    beforeEach(() => {    
        component = StageComponent.withResources('app').inView('<app></app>');
        component.bootstrap(aurelia => {
            aurelia.use.standardConfiguration();
            aurelia.container.registerInstance(UserService, userService);
            aurelia.container.registerInstance(EventAggregator, eventAggregator);
        });

        createComponent = component.create(bootstrap);
    });

    // this one is working for example..
    it('should get authorized user when token is set', (done) => {
        const result = 'some value';

        spyOn(UserService, 'getToken').and.returnValue(true);
        spyOn(userService, 'getAuthorizedUser').and.returnValue(Promise.resolve('some value'));

        createComponent.then(() => {
            const viewModel = component.viewModel;
            expect(viewModel.authorizedUser).toEqual(result);
            done();
        });
    });

    // this one is failing (depending on Event Aggregator)
    it('should set authorized user when LOGGED_IN event is fired', (done) => {
        spyOn(UserService, 'getToken').and.returnValue(false);

        createComponent.then(() => {
            const viewModel = component.viewModel;
            expect(viewModel.authorizedUser).toEqual(null);

            eventAggregator.publish(EVENTS.USER_LOGGED_IN, 'some value');
            expect(viewModel.authorizedUser).toEqual('some value');
            done();
        });
    });

    afterEach(() => {
        component.dispose();
    });


});

1 ответ

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

describe('app', () => {
    let sut,
        userServiceMock,
        eventAggregator;

    beforeEach(() => {
        userServiceMock = new UserServiceMock(); // use a mock for the original service
        eventAggregator = new EventAggregator();
        sut = new App(userServiceMock, eventAggregator);
    });

    describe('subscribing to events', () => {

        it('should set authorized user when LOGGED_IN event is fired', done => {
            const authUser = {someKey: 'someValue'};

            // expect initial values
            expect(sut.authorizedUser).toEqual(null);

            // publish an event     
            eventAggregator.publish(EVENTS.USER_LOGGED_IN, authUser);
                                 // ^ this is just a string constant

            // expect the values changes triggered by the event
            expect(sut.authorizedUser).toEqual(authUser);

            done();
        });
    });

    afterEach(() => {
        // sut.dispose() doesn't work here, still need to figure this out
    });

});
Другие вопросы по тегам