2017-08-07 90 views
18

我正在爲我的組件編寫一些單元測試,這個神祕的錯誤信息。我在Angular 2 unit testing - getting error Failed to load 'ng:///DynamicTestModule/module.ngfactory.js'處發現了類似的問題,但答案並未幫助我解決問題。我的角度4.3.2Angular 4單元測試錯誤 - 無法在'XMLHttpRequest'上執行'send':無法加載'ng:///DynamicTestModule/LoginComponent.ngfactory.js'

下面是我寫的測試組件:

import {Component} from '@angular/core'; 
import {Router} from '@angular/router'; 

import {NotificationService} from '../common/notification/notification.service'; 
import {SessionService} from '../common/session/session.service'; 
import {Login} from './login.model'; 

@Component({ 
      selector: 'cc-login-form', 
      templateUrl: './login.component.html', 
      styleUrls: ['./login.component.scss'], 
      }) 
export class LoginComponent { 
    model: Login = new Login('', ''); 

    constructor(private sessionService: SessionService, 
       private router: Router, 
       private notificationService: NotificationService) { 
    } 

    onSubmit() { 
    this.sessionService 
     .login(this.model.email, this.model.password) 
     .subscribe(
      sessionInfo => { 
      this.notificationService.showSuccess('notification.successfully.logged.in'); 
      this.router.navigate([`/cc/list`]); 
      }, 
      error => this.notificationService.showError('notification.invalid.login') 
     ); 
    } 
} 

,這裏是測試文件:

import {async, ComponentFixture, TestBed} from '@angular/core/testing'; 
import {FormsModule} from '@angular/forms'; 
import {Router} from '@angular/router'; 
import {TranslateModule, TranslateService} from '@ngx-translate/core'; 
import {NotificationService} from '../common/notification/notification.service'; 
import {NotificationServiceStub} from '../common/notification/tests/NotificationServiceStub'; 
import {SessionService} from '../common/session/session.service'; 
import {SessionServiceStub} from '../common/session/tests/SessionServiceStub'; 
import {RouterStub} from '../common/tests/RouterStub'; 
import {TranslateServiceStub} from '../common/translate/tests/TranslateServiceStub'; 

import {LoginComponent} from './login.component'; 

describe('LoginComponent',() => { 
    let component: LoginComponent; 
    let fixture: ComponentFixture<LoginComponent>; 

    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
            imports: [ 
             FormsModule, 
             TranslateModule 
            ], 
            declarations: [LoginComponent], 
            providers: [ 
             {provide: SessionService, useClass: SessionServiceStub}, 
             {provide: Router, useClass: RouterStub}, 
             {provide: NotificationService, useClass: NotificationServiceStub}, 
             {provide: TranslateService, useClass: TranslateServiceStub}, 
            ] 
            }) 
      .compileComponents(); 
    })); 

    beforeEach(() => { 
    fixture = TestBed.createComponent(LoginComponent); 
    component = fixture.componentInstance; 
    fixture.detectChanges(); 
    }); 

    it('should be created',() => { 
    expect(component).toBeTruthy(); 
    }); 
}); 

運行測試時,我得到以下的鉻控制檯:

zone.js:2642 XMLHttpRequest cannot load ng:///DynamicTestModule/LoginComponent.ngfactory.js. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. 
(anonymous) @ zone.js:2642 
zone.js:195 Uncaught DOMException: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'ng:///DynamicTestModule/LoginComponent.ngfactory.js'. 
    at http://localhost:9876/_karma_webpack_/webpack:/Users/pedrompg/Documents/quandoo/fe/chains-center/~/zone.js/dist/zone.js:2642:1 
    at XMLHttpRequest.proto.(anonymous function) [as send] (

任何可以幫助我呢?

編輯 - 1 這裏的服務/存根實現

SessionServiceStub

export class SessionServiceStub implements ISessionService { 
    login(login: string, password: string): Observable<any> { 
    return Observable.of({merchantId: 123}); 
    } 

    logout(): Observable<any> { 
    throw new Error('Method not implemented.'); 
    } 

    validateSessionToken(): Observable<any> { 
    throw new Error('Method not implemented.'); 
    } 
} 

SessionService

@Injectable() 
export class SessionService implements ISessionService { 

    constructor(private http: CcHttpClient, private router: Router, private localSessionService: LocalSessionService) { 
    } 

    login(login: string, password: string): Observable<any> { 
    return this.http.post(`api/sessions`, {login: login, password: password}).map((res: Object) => { 
     this.localSessionService.createSession(res); 
     return res; 
    }); 
    } 
} 

RouterStub

export class RouterStub { 
    navigate(commands: any[], extras?: NavigationExtras): Promise<boolean> { 
    return Promise.resolve(true); 
    }; 
} 

TranslationServiceStub

export class TranslateServiceStub { 
    instant(key: string | Array<string>, interpolateParams?: Object): string | any { 
    return 'translation'; 
    }; 
} 

NotificationServiceStub

export class NotificationServiceStub implements INotificationService { 
    showToast(type, text, title, defaultTitle): Promise<Toast> { 
    return Promise.resolve(null); 
    } 

    showSuccess(msg, title?): Promise<Toast> { 
    return Promise.resolve(null); 
    } 

    showError(msg, title?): Promise<Toast> { 
    return Promise.resolve(null); 
    } 
} 

EDIT 2 改變我的測試牀配置以下刪除錯誤,但帶來了一個新問題:

beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
            imports: [ 
             FormsModule, 
             HttpClientModule, 
             TranslateModule.forRoot({ 
                   loader: { 
                    provide: TranslateLoader, 
                    useFactory: HttpTranslateLoaderFactory, 
                    deps: [HttpClient] 
                   } 
                   }) 
            ], 
            declarations: [LoginComponent], 
            providers: [ 
             {provide: SessionService, useClass: SessionServiceStub}, 
             {provide: Router, useClass: RouterStub}, 
             {provide: NotificationService, useClass: NotificationServiceStub}, 
            ] 
            }) 
      .compileComponents(); 
    })); 

現在的錯誤消息是

TypeError: Cannot read property 'assertPresent' of undefined 
     at resetFakeAsyncZone home/pedrompg/Documents/quandoo/fe/chains-center/~/@angular/core/@angular/core/testing.es5.js:304:1) 
     at Object.<anonymous> home/pedrompg/Documents/quandoo/fe/chains-center/~/@angular/core/@angular/core/testing.es5.js:1001:1) 
     at ZoneQueueRunner.webpackJsonp.../../../../zone.js/dist/jasmine-patch.js.jasmine.QueueRunner.ZoneQueueRunner.execute home/pedrompg/Documents/quandoo/fe/chains-center/~/zone.js/dist/jasmine-patch.js:132:1) 

這在這個功能會發生:

function resetFakeAsyncZone() { 
    _fakeAsyncTestZoneSpec = null; 
    ProxyZoneSpec.assertPresent().resetDelegate(); //ProxyZoneSpec is undefined here for whatever reason 
} 
+0

是什麼'RouterStub'樣子? – markblandford

+0

編輯的問題與存根 –

回答

5

我只是碰到了這個錯誤,問題是我的嘲笑。 在component.ngOnInit我用this.route.paramMap.subscribe(...) 其中路線是ActivatedRoute實例

在我的測試中,我提供了這樣一個模擬服務:

providers: [ 
    { provide: ActivatedRoute, useValue: { snapshot: { params: { id: 1 } } } } 
] 

事實上,我錯過了嘲笑paramMap方法

然後我修復它添加這樣

providers: [ 
    { provide: ActivatedRoute, useValue: { snapshot: { params: { id: 1 } }, paramMap: Observable.of({get:() => 1}) } } 
] 

paramMap屬性,然後我沒有了這個愚蠢的錯誤。

那麼對你來說,我期望類SessionServiceStub不完整或錯誤的。它會得到一個返回Observable的登錄方法嗎?

如果不是,你可以檢查NotificationServiceStub

你應該使用調試器(帶Webstorm很容易調試一步一步),以幫助您的問題。

+0

我已經添加了對這個問題 –

+0

從CoMP所有必需的方法存根存根......但你能評論的2線的訂閱和使用的console.log更換(sessionInfo內)? – Rebolon

+0

確定我縮小了一下....評論我的模板上的翻譯管道的所有用法將錯誤從那個神祕的一個改爲這個其他不是很有用的消息: TypeError:無法讀取未定義的屬性'assertPresent' \t在resetFakeAsyncZone家/ pedrompg /文檔/ quandoo/FE /鏈中心/ .... –

22

這是Angular Cli版本1.2.2或更新版本的問題。用--sourcemaps=false運行你的測試,你會得到正確的錯誤信息。

ng test --sourcemaps=false

編輯

速記是這樣的:

ng test -sm=false

這裏查看詳情:https://github.com/angular/angular-cli/issues/7296

+1

這樣做的速記是'-sm = FALSE' –

+0

,如果我得到這個錯誤usingkarma怎麼辦? – wvicioso

+0

@wvicioso:Sry基因,我不知道這一點。 –

相關問題