2017-04-21 6 views
1

Angular(2)開発者として、私は最近Aureliaの実験を開始しました。本当にそれが好きです.. しかし、私は本当にAureliaのユニットテストのいくつかの困難があるEvent Aggregator。これは私が現在持っているものですが、私のコントローラーでイベントを発生させません。私は今それを間違っている、いくつかの助けが素晴らしいだろう!Aurelia:unit-testingイベントアグリゲータ

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


}); 
+0

EventAggregatorのインスタンスをチェックしましたか?彼らは確かに同じですか?あなたがそのインスタンスを登録するとき、彼らはすべきだと思います。しかし、 'registerSingleton()'を試してみてください。違いはありません。 –

+0

問題は、 'new EventAggregator'を使用しているためです。あなたのクラスは、EventAggregatorクラスの__same__インスタンスを使用している必要があります。また、私は 'EVENTS.USER_LOGGED_IN'がある種の文字列であると思います。 – Tom

+0

@thebluefox返信いただきありがとうございます。はい、それは定数としてインポートされた文字列です。また、(私のために)働く解決策で私の質問に答えました。御時間ありがとうございます! –

答えて

0

だから、いくつかの試行錯誤の後、私は上記のコードをユニット・テストする方法を見つけました。本当にAureliaの文書に従っているわけではありませんが、私は実際にこのようなテスト方法に非常に満足しています。これがあなたの一部を助けてくれることを願っています。これが正しい方法であるかどうかわからないが、それは私のために働く。あなたの考えをお聞かせください。

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

}); 
関連する問題