试图在Test

时间:2016-12-13 06:06:01

标签: angular typescript jasmine karma-jasmine

所以我试图获取一个令牌,因为它需要在api身份验证中获取列表。我开始导入angular2-token:

import { Angular2TokenService } from 'angular2-token';

然后我添加了describe块:

describe('ListComponent Tests', () => {
  let token: Angular2TokenService;

  beforeAll(() => {
    token.init();
    token.signIn('test@email.com', 'foobar');
  }
}

但我收到了错误:

TypeError: Cannot read property 'init' of undefined

现在我不确定如何在测试中真正获得登录令牌。

1 个答案:

答案 0 :(得分:0)

您尚未将token初始化为任何内容,因此错误。当您为被测组件创建服务的模拟时,通常只需为预期要调用的函数创建spy即可。然后在测试中,您只想检查组件是否实际调用了函数。您还需要将实际服务替换为模拟服务,因此您需要将模拟配置为提供者替代。例如

@Component({
  ...
})
class TestComponent {
  constructor(private token: Angular2TokenService) {}

  ngOnInit() {
    token.init();
  }

  onLogin(email, password) {
    token.signIn(email, password);
  }
}

describe('..', () => {
  let tokenStub;
  let component;
  let fixture;

  beforeEach(() => {
    tokenStub = {
      init: jasmine.createSpy('init'),
      signIn: jasmine.createSpy('signIn')
    }

    TestBed.configureTestingModule({
      declarations: [ TestComponent ],
      providers: [{ provide: Angular2TokenService, useValue: tokenStub }]
    })

    fixture = TestBed.createComponent(TestComponent);
    component = fixture.componentInstance;
  })

  it('should init the token when component created', () => {
    fixture.detectChanges();
    expect(tokenStub.init).toHaveBeenCalled();
  })

  it('should signin token when component login', () => {
    component.onLogin();
    expect(tokenStub.signIn).toHaveBeenCalledWith('test@email.com', 'foobar')
  })
})

您可以看到使用toHaveBeenCalledXxx方法检查函数是否被调用,这些方法可以带参数。

如果您没有使用TestBed配置,那么只需执行类似

的操作即可轻松将其作为独立测试
let tokenStub: Angular2TokenService;
let component;

beforeEach(() => {
  tokenStub = {
    init: jasmine.createSpy('init'),
    signIn: jasmine.createSpy('signIn')
  } as Angular2TokenService;

  component = new TestComponent(tokenStub);
})

it('..', () => {
  component.ngOnInit();
  expect(tokenStub.init).toHaveBeenCalled();
})

请务必阅读与上述相关联的间谍文档。你可以用间谍做其他事情,比如让它们返回特定的东西,等等。