2017-01-31 4 views
1

Выполнить код внутри метода подписки.Невозможно выполнить код внутри издевающегося метода подписки

Короче говоря, я тестирую службу, которая извлекает JWT token, и мне нужен код внутри этого subscribe для выполнения при издевательстве this.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; 
     } 
    } 
} 

AuthenticationLibrary.service.spec.ts:

И я насмешливый this.jwtService.getToken() часть, чтобы вернуться:

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

Вот весь файл:

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

Как мне высмеять jwtService.getToken способом, который вызывает код внутри метода subscribe в моем верхнем блоке кода для выполнения?

ответ

2

Вы возвращаете макет с функцией подписки вместо макета, который имеет функцию подписки с обратным вызовом next. Лично я бы заглушил Observable версией, содержащей точные данные, которые вы ожидаете:

let jwtSvcSpy = jasmine.createSpyObj('jwtService', ['getToken']); 
jwtSvcSpy.getToken.and.callFake(() => { 
    return Rx.Observable.of(new Response(
     new ResponseOptions({ 
     body: { 
      token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0.yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw" 
     } 
     }) 
    )) 
}); 
Смежные вопросы