2017-04-21 4 views
1

Als Angular (2) -Entwickler habe ich kürzlich damit begonnen, mit Aurelia zu experimentieren. Wirklich mag es übrigens .. Aber ich habe wirklich einige Schwierigkeiten Uniteling Event Aggregator. Dies ist, was ich derzeit habe, aber es löst das Ereignis in meinem Controller jetzt nicht aus. Ich mache es jetzt falsch, einige Hilfe wäre großartig!Aurelia: Unit-Testing 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() { 
     .... 
    } 
} 

Und meine spec sieht derzeit wie folgt aus:

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


}); 
+0

Haben Sie die Instanzen von EventAggregator überprüft? Sind sie das selbe? Ich denke, sie sollten es tun, wenn Sie eine Instanz davon registrieren. Sie können jedoch versuchen, "registerSingleton()", obwohl ich denke, dass es keinen Unterschied machen sollte. –

+0

Das Problem liegt daran, dass Sie 'new EventAggregator' verwenden. Ihre Klassen müssen die Instanz __same__ der EventAggregator-Klasse verwenden. Auch - ich vermute 'EVENTS.USER_LOGGED_IN' ist eine Art String? – Tom

+0

@thebluefox Vielen Dank für Ihre Antwort, ja, es ist eine Zeichenfolge, die aus einer Konstante importiert wird. Auch aktualisiert beantwortet meine Frage mit einer (für mich) funktionierenden Lösung. Vielen Dank für Ihre Zeit! –

Antwort

0

Nach einiger Versuch und Irrtum, ich herausgefunden habe, wie Unit-Test den obigen Code. Es folgt Aurelias Dokumenten nicht wirklich, aber ich bin wirklich sehr zufrieden mit dieser Art zu testen. Ich hoffe, dass dies einigen von Ihnen helfen kann. Ich weiß nicht, dass dies der richtige Weg ist, aber es funktioniert für mich. Bitte kommentieren Sie Ihre Gedanken ..

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

});