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
});
});