Angular 无法在模拟订阅方法内执行代码

Angular 无法在模拟订阅方法内执行代码,angular,rxjs,observable,subscribe,Angular,Rxjs,Observable,Subscribe,在subscribe方法中执行代码 长话短说,我正在测试一个检索a的服务,我需要在模拟这个.jwtService.getToken().subscribe(tokenResp=>时执行订阅中的代码,但它不执行。请参阅订阅中的注释: 正在测试的系统:AuthenticationLibrary.service.ts: getNewToken() { var self = this; if (self.busyGettingToken == false) { self.

在subscribe方法中执行代码

长话短说,我正在测试一个检索a的服务,我需要在模拟
这个.jwtService.getToken().subscribe(tokenResp=>
时执行
订阅中的代码,但它不执行。请参阅订阅中的注释:

正在测试的系统:AuthenticationLibrary.service.ts:

getNewToken() {
    var self = this;
    if (self.busyGettingToken == false) {
        self.busyGettingToken = true;
        this.jwtService.getToken().subscribe(tokenResp => 
        {
             self.token = tokenResp.token<-------CODE NOT MAKING IT INTO HERE
             self.busyGettingToken = false;
             self.frontEndLoggingService.Log("getNewToken() Acquired: " + self.token, true);
        });
    } 
}

isTokenValid() {
    if (this.token == null)
    {
        return false;
    }
    else
    {
        var base64Url = this.token.split('.')[1];
        var base64 = base64Url.replace('-', '+').replace('_', '/');            
        var jwt = JSON.parse(window.atob(base64));            

        if (jwt.exp >= this.configurationService.jwtRenewTime() / 1000) {
            //Does not expire within the next x ms
            return true;
        } else {
            //Expires within the next x ms
            return false;
        }
    }
}  
以下是整个文件:

/// <reference path="../../typings/globals/es6-shim/index.d.ts"/>
/// <reference path="../../typings/globals/jasmine/index.d.ts" />
import { inject, TestBed, ComponentFixture } from "@angular/core/testing";
import { RouterTestingModule } from "@angular/router/testing";
import { Headers, HttpModule, BaseRequestOptions, XHRBackend, Response, Http, ResponseOptions } from "@angular/http";
import { MockBackend, MockConnection } from "@angular/http/testing";
import { Component, DebugElement } from "@angular/core";
import { By } from '@angular/platform-browser';
import "rxjs/add/operator/toPromise";

import { AuthenticationLibrary } from "../../app/services/authenticationLibrary.service";
import { ConfigurationService } from "../../app/services/configuration.service";
import { FrontEndLoggingService } from "../../app/services/frontEndLogging.service";
import { JwtService } from "../../app/services/jwt.service";
import { UtilitiesService } from "../../app/services/utilities.service";

describe("Authentication service", () => {

    let mockBackend;
    let jwtService;
    let configurationService;
    let http;
    let feLogSvc;

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [HttpModule],
            providers: [
                { provide: XHRBackend, useClass: MockBackend },
                ConfigurationService,
                FrontEndLoggingService,
                JwtService,
                UtilitiesService
            ]
        });

        mockBackend = TestBed.get(XHRBackend);
        jwtService = TestBed.get(JwtService);
        configurationService = TestBed.get(ConfigurationService);
        http = new Http(mockBackend, new BaseRequestOptions);
        feLogSvc = TestBed.get(FrontEndLoggingService);
    });

    it("Should tell if token is valid", () => {

        mockBackend.connections.subscribe(
            (connection: MockConnection) => {
                connection.mockRespond(new Response(
                    new ResponseOptions({
                    body: {
                        token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0.yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw"
                    }
                    })
                ));
            });

   let jwtSvcSpy = jasmine.createSpyObj('jwtService', ['getToken']);
        jwtSvcSpy.getToken.and.callFake(() => {
            return {
                subscribe: () => {
                    return new Response(
                    new ResponseOptions({
                    body: {
                        token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0.yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw"
                    }
                    })
                )
                }
            };
        });

        let authLibService = new AuthenticationLibrary(
            http,
            configurationService,
            feLogSvc,
            jwtSvcSpy
        );

        authLibService.getNewToken();
        expect(authLibService.isTokenValid()).toBe(true);
    })
});
//
/// 
从“@angular/core/testing”导入{inject,TestBed,ComponentFixture};
从“@angular/router/testing”导入{RouterTestingModule}”;
从“@angular/Http”导入{Headers,HttpModule,BaseRequestOptions,XHRBackend,Response,Http,ResponseOptions};
从“@angular/http/testing”导入{MockBackend,MockConnection}”;
从“@angular/core”导入{Component,DebugElement};
从“@angular/platform browser”导入{By}”;
导入“rxjs/add/operator/toPromise”;
从“../../app/services/AuthenticationLibrary.service”导入{AuthenticationLibrary}”;
从“./../app/services/configuration.service”导入{ConfigurationService}”;
从“../../app/services/FrontEndLoggingService”导入{FrontEndLoggingService}”;
从“../../app/services/jwt.service”导入{JwtService}”;
从“../../app/services/utilities.service”导入{UtilitiesService}”;
描述(“身份验证服务”,()=>{
让我们一起来吧;
让jwt服务;
让配置服务;
让http;
让feLogSvc;
在每个之前(()=>{
TestBed.configureTestingModule({
导入:[HttpModule],
供应商:[
{provide:XHRBackend,useClass:MockBackend},
配置服务,
前端记录服务,
JwtService,
公用事业服务
]
});
mockBackend=TestBed.get(XHRBackend);
jwtService=TestBed.get(jwtService);
configurationService=TestBed.get(configurationService);
http=新的http(mockBackend,新的BaseRequestOptions);
feLogSvc=TestBed.get(前端日志服务);
});
它(“应该告诉令牌是否有效”,()=>{
mockBackend.connections.subscribe(
(连接:MockConnection)=>{
连接。mockRespond(新响应(
新反应({
正文:{
令牌:“eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.EYJPC3MIOIJ0B3B0YWWUY2TZWIZJ0NDI2NDIWODWIZJODHRWOI8VDG9WDGFSLMNVBS9QD3RFY2XHAW1ZL2LZX2FKBLUIJP0CNWLLJJB21WYW55IWIWIWVG9WDIWUWIY2TZSI6DHJ1ZX0.YRQYRYNWWWZKZZKZZZZKZUKWAQUPWKKIUZKELZ7OWXW”
}
})
));
});
让jwtSvcSpy=jasmine.createSpyObj('jwtService',['getToken']);
jwtSvcSpy.getToken.and.callFake(()=>{
返回{
订阅:()=>{
返回新的响应(
新反应({
正文:{
令牌:“eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.EYJPC3MIOIJ0B3B0YWWUY2TZWIZJ0NDI2NDIWODWIZJODHRWOI8VDG9WDGFSLMNVBS9QD3RFY2XHAW1ZL2LZX2FKBLUIJP0CNWLLJJB21WYW55IWIWIWVG9WDIWUWIY2TZSI6DHJ1ZX0.YRQYRYNWWWZKZZKZZZZKZUKWAQUPWKKIUZKELZ7OWXW”
}
})
)
}
};
});
让authLibService=newauthenticationlibrary(
http,,
配置服务,
feLogSvc,
jwtSvcSpy
);
authLibService.getNewToken();
expect(authLibService.isTokenValid()).toBe(true);
})
});

如何模拟
jwtService.getToken
,使顶部代码块中的
subscribe
方法中的代码得以执行?

您返回的是一个带有subscribe函数的模拟,而不是一个带有subscribe函数的模拟,它的subscribe函数执行回调
next
。就我个人而言,我会用一个ver来存根可观察对象包含您期望的确切数据的sion:

let jwtSvcSpy = jasmine.createSpyObj('jwtService', ['getToken']);
jwtSvcSpy.getToken.and.callFake(() => {
    return Rx.Observable.of(new Response(
      new ResponseOptions({
        body: {
          token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0.yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw"
        }
      })
    ))
});
let jwtSvcSpy = jasmine.createSpyObj('jwtService', ['getToken']);
jwtSvcSpy.getToken.and.callFake(() => {
    return Rx.Observable.of(new Response(
      new ResponseOptions({
        body: {
          token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0.yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw"
        }
      })
    ))
});