Angular 5依赖注入(对测试文件的服务)

时间:2018-04-10 12:36:28

标签: angular dependency-injection

我正在学习大理石测试,在关注this tutorial时,我达到了我的简单测试看起来像这样的程度:

用户-effects.service.spec.ts

imports ...
describe('User Effects', () => {
    it('basic test', () => {
        const source = cold('--a', { a: { type: LOGIN } });
        const effects = new UserEffectsService(new Actions(source), ?? );

        const expected = cold('--b', { b: { type: LOGIN_SUCCESS } });
        expect(effects.login$).toBeObservable(expected);
    });
});

但是我的UserEffectsService需要2个参数

用户-effects.service.ts

@Injectable()
export class UserEffectsService {
    constructor(private actions$: Actions, private userService: UserDataService) {
    }
    ...

也许我可以传递一个新的UserDataService实例,但是UserDataService需要另外两个参数等,并且会有一个长链。在没有构造函数的情况下,我无法找到任何注入依赖项的解决方案。感谢您提供有关如何处理此案例的任何提示。

@edit 的人? :d

2 个答案:

答案 0 :(得分:1)

有一种方法可以做到这一点。

在您的beforeEach中,您可以注入以下服务:

let service = TestBed.get(UserDataService)

然后,当您创建新的效果实例时,您只需传递服务实例即可。

const effectService = new UserEfectsService(action,service); 

如果您有多项服务,可以执行以下操作:

let [service1, service2, serviceN] = [Service1, Service2, ServiceN].map(TestBed.get);

答案 1 :(得分:1)

将注射模拟到您的服务中。

const actionsMock = {};
const userServiceMock = {};

然后,将当前服务中使用的所有变量和函数放入模拟中。

例如,我们假设您使用用户服务中的getAllUsers函数:然后将其添加到模拟中:

const userServiceMock = {
  getAllUsers: () => Observable.of([/* array of users */])
};

现在,您可以创建任意数量的对象:

const instance = new UserEffectsService(actionsMock, userServiceMock);