【问题标题】:Angular2 rc3 injecting router into testsAngular2 rc3将路由器注入测试
【发布时间】:2016-06-29 17:55:02
【问题描述】:

自从我升级到 Angular2 rc3 后,任何需要注入路由器的测试现在都失败了。以前我使用的是路由器/测试文件中提供的 ROUTER_FAKE_PROVIDERS,但它似乎不再存在。有什么建议么?

【问题讨论】:

  • 问题解决了吗?

标签: angular angular2-router angular2-router3


【解决方案1】:

我使用了这个设置来初始化路由器。 https://github.com/angular/angular/blob/master/modules/%40angular/router/test/router.spec.ts

期望 Angular2 很快将其作为 TestProvider 提供。

import {Location, LocationStrategy} from '@angular/common';
import {SpyLocation} from '@angular/common/testing';
import {MockLocationStrategy} from '@angular/common/testing/mock_location_strategy';
import {Component, Injector, ComponentResolver} from '@angular/core';
import {ActivatedRoute, ActivatedRouteSnapshot, CanActivate, CanDeactivate, DefaultUrlSerializer, Event, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Params, ROUTER_DIRECTIVES,  Router, RouterConfig, RouterOutletMap, RouterStateSnapshot, RoutesRecognized, UrlSerializer} from '@angular/router';


export function provideTestRouter(RootCmp:any, config: RouterConfig):any[]{      
    return [
      RouterOutletMap,
      {provide: UrlSerializer, useClass: DefaultUrlSerializer},
      {provide: Location, useClass: SpyLocation},
      {provide: LocationStrategy, useClass: MockLocationStrategy},
      {
        provide: Router,
        useFactory: (resolver: ComponentResolver, urlSerializer: UrlSerializer, outletMap: RouterOutletMap, location: Location, injector: Injector) => {
          return new (<any>Router)(
          RootCmp, resolver, urlSerializer, outletMap, location, injector, config);
        },
        deps: [ComponentResolver, UrlSerializer, RouterOutletMap, Location, Injector]
      },
      {provide: ActivatedRoute, useFactory: (r: Router) => r.routerState.root, deps: [Router]},
    ];
};

【讨论】:

    【解决方案2】:

    看看my answer here,你好像也有类似的问题。

    在进行单元测试时,有时某个服务会因为没有在正常环境中使用而导致问题。您可以测试它是否已被调用,而无需在整个服务中运行单元测试。通过创建一个模拟类来做到这一点。

    根据该帖子,您可以执行以下操作:

    describe('foo', () => {
    
    class MockRouter{}
    
    beforeEachProviders(() => [
      {provide: ROUTER_PROVIDERS, useClass: MockRouter}
    ]);
    
    it('should foo',
      async(inject([FooComponent, ROUTER_PROVIDERS], (foo: FooComponent, mockRouter: MockRouter) => {
      expect(mockRouter).toHaveBeenCalled();
      });
    })));
    

    【讨论】:

    • 谢谢,我已经尝试过了,但我需要实际的路由器来处理我在代码中的依赖项。我可以全部模拟出来,但这将是多余的。
    • 没问题,我明白了。你的代码依赖于路由器的什么?
    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多