如何在Angular中模拟服务的响应函数?

时间:2017-08-02 18:18:46

标签: angular unit-testing service mocking

因此,在测试中我已经为AuthService提供了一个模拟类

MyStruct PopulateStruct() {
    MyStruct s;
    s.a = x;
    s.b = y;
    return s;
}

void Caller() {
    MyStruct s = PopulateStruct();
}

此模拟服务具有 isAuthorized()功能,始终返回true ;

而且,在规范中,看起来像这样

    { provide: AuthService, useClass: AuthServiceMock }

编辑:添加了描述的完整代码

it('init root with LOGIN PAGE if is authenticated, () => {

    expect(comp['rootPage']).toBe(LoginPage); // true!

});

it('init root with WELCOME PAGE if is not authenticated, () => {

    // Here I need to change the result of isAuthorized()
    // so inside the AuthServiceMock returns false
    expect(comp['rootPage']).toBe(WelcomePage); // false :(

});

1 个答案:

答案 0 :(得分:2)

你真的错过了很多这方面的信息,但是让我试着帮忙。

希望AuthServiceMock.isAuthorized实际上已经是一个茉莉花间谍了。这可以在定义类时完成:

class AuthServiceMock {
  isAuthorized = jasmine.createSpy('auth.isAuthorized').and.returnValue(true);
}

如果是这种情况,并且isAuthorized是间谍,那么您可以更改第二次测试中间谍的返回值,如下所示:

it('init root with WELCOME PAGE if is not authenticated',
  inject([AuthService], (mockAuthInstance) => {
    mockAuthInstance.isAuthorized.and.returnValue(false);
    expect(comp.rootPage).toBe(WelcomePage);
  })
);

在这个例子中,我们使用了预定义的注入规则,并将模拟服务直接注入到我们的测试中。

如果isAuthorized尚未成为间谍,那么您可以在测试中将其作为间谍,如下所示

it('init root with WELCOME PAGE if is not authenticated', 
  inject([AuthService], (mockAuthInstance) => {
    spyOn(mockAuthInstance, 'isAuthorized').and.returnValue(false);
    expect(comp.rootPage).toBe(WelcomePage);
  })
);