2017-04-25 137 views
0

我无法找到正确的解决方案来测试其他服务作为依赖关系的服务。我正在测试的服务在另一个返回任务列表的服务上调用getter方法。这是我测试服务:服务依赖关系的测试服务

服务测试:

export class TasksData { 
    public tasks = []; 
    public tasksData = [ 
    { 
     'form': 'setup-device', 
     'type': 'register-device', 
     'text': 'Register Device', 
     'icon': 'mdi-cellphone-link', 
     'status': '' 
    }, 
    { 
     'form': 'setup-eula', 
     'type': 'confirm-eula', 
     'text': 'Agree to EULA', 
     'icon': 'mdi-pen', 
     'status': '' 
    }, 
    { 
     'form': 'setup-change-password', 
     'type': 'change-password', 
     'text': 'Change Password', 
     'icon': 'mdi-lock-reset', 
     'status': '' 
    }, 
    { 
     'form': 'setup-profile', 
     'type': 'register-profile', 
     'text': 'Register Profile', 
     'icon': 'mdi-account-plus', 
     'status': '' 
    } 
    ]; 

    constructor(private setupManager: SetupManagerService) {} 

    public getter() { 
    let data = []; 
    this.tasks = this.setupManager.getter(); 

    data = this.tasksData.filter((task) => { 
     return (this.tasks.indexOf(task.type)) !== -1; 
    }); 

    return data; 
    } 
} 

依存服务:

export class SetupManagerService { 
    private message: string; 
    private redirect = ''; 
    private tasks: any = []; 
    private clone: any = []; 
    private user: Object = {}; 

    public taskChange = new Subject(); 

    constructor(
    private closeModal: CloseModalService, 
    private pubsub: Pubsub, 
    private reloadStatus: ReloadStatusService, 
    private router: Router, 
    private storage: HTML5Storage 
) {} 

    // ===== Removed code for brevity ===== // 

    public getter() { 
    return this.clone; 
    } 
} 

测试:

import { TestBed } from '@angular/core/testing'; 

// Test Case: 
import { TasksData } from '../tasks-data.service'; 

// Dependencies: 
import { SetupManagerService } from '../setup-manager.service'; 

let ds = [{ 
    'form': 'setup-device', 
    'type': 'register-device', 
    'text': 'Register Device', 
    'icon': 'mdi-cellphone-link', 
    'status': '' 
}]; 

class SetupManagerServiceStub { 
    getter() { 
    return ['register-device']; 
    } 
} 

fdescribe('Service TaskData',() => { 
    let subject = TasksData; 
    let setupManager; 

    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
     TasksData, 
     { provide: SetupManagerService, useClass: SetupManagerServiceStub } 
     ] 
    }); 

    subject = TestBed.get(TasksData); 
    setupManager = TestBed.get(SetupManagerService); 
    }); 

    it('should create an instance',() => { 
    expect(subject).toBeDefined(); 
    }); 

    it('should... ',() => { 
    expect(subject.getter()).toEqual(ds); 
    }); 
}); 

我想的如何做到这一点网上很多不同的例子,但他们大多没有工作,可能是因为它们不再有效,由于之前的最后释放角度的变化。

TasksData服务将SetupManagerService作为依赖项。因此,为了避免必须添加所有SetupManagerService依赖项,我使用getter方法创建了一个存根类,并且我返回了测试TaskData服务所需的期望值。

首先,我不确定这是否是正确的方法。 Angular的测试文档没有例子说明如何使用TestBed模块测试服务依赖关系。这是我整整一天努力的最佳工作成果。

我的问题是否这是正确的只是我的问题的一部分。另一个问题是Typescript抱怨我做了什么,我还没有找到解决这个问题的方法。

即使以测试通过我得到以下错误:

enter image description here

而且这个丑陋的红色下划线警告在我的编辑器:

enter image description here

+2

非常有趣的评论。我很确定大多数开发人员通过阅读文档来学习如何使用框架。正如我上面所说的,使用TestBed测试具有服务依赖性的服务并不存在。如果你没有任何建设性的话可能会停下来,因为这应该是一个学习的地方。 – Aaron

回答

1

这仅仅是一个打字稿问题,更具体地说这一行:

let subject = TasksData; 

subject(应该是TasksData的一个实例)可以分配给构造函数的原因没有很好的理由。如果subject由于某些原因不会被重新分配,它将不会是undefined,但它仍然不会是一个实例。这将导致更难以调试的测试。

这里subject被隐式分配的值类型的,它是作为

let subject: typeof TasksData = TasksData; 

同样与

subject = new TasksData(); 

重新分配它会导致错误类型,清楚地表明什么是错的,

Type 'TasksData' is not assignable to type 'typeof TasksData'.

但自从TestBed.get isn't type safe and returns any,它不会触发类型错误a很明显,只有在访问subject.getter时,类型才会变得混乱。

应该

let subject: TasksData; 
+0

谢谢。这当然解决了它。我很感激。 – Aaron

+0

不客气。 – estus