如何在Angular单元测试中模拟/侦察导入的函数

时间:2018-05-30 12:56:42

标签: angular unit-testing mocking spy

让我说我有一个角度为6的组件,方法test会返回一些值:

import { doSomething } from './helper';

@Component({
    ...
})
export class AppComponent {
    test() {
        const data = doSomething(1);
        return data.something ? 1: 2;
    }
}

doSomething只是一个简单的辅助函数:

export function doSomething() {
    return { something: 1 };
}

是否可以在单元测试中模拟或监视此函数(因此我可以控制其returnValue)?或者我是否必须在组件中更改我的方法?

请注意:doSomething()可以是lodash函数,const,类等。我只是想尽可能简单地保持示例。

我尝试的事情:

  • SpyOn无法正常工作,因为功能未附加到任何内容

  • 将模拟函数导入imports TestBed.configureTestingModule数组Unexpected value 'doSomething' imported by the module 'DynamicTestModule'. Please add a @NgModule annotation.

  • 为它创建服务有效,但必须为每个导入的函数创建服务感到愚蠢

2 个答案:

答案 0 :(得分:8)

在您的spec文件中以这种方式导入帮助程序:

druid.segmentCache.locations

在你的it()中,你可以监视辅助对象并返回请求的值:

import * as helper from './helper';

答案 1 :(得分:0)

模拟外部函数是不可能的,但您可以执行以下操作,这样可以正常工作。

import { doSomething } from './helper';

@Component({
    ...
})
export class AppComponent {
    const doSomethingRef = doSomething; 
    test() {
        const data = this.doSomethingRef(1);
        return data.something ? 1: 2;
    }
}

现在,因为我们可以模拟 doSomethingRef

describe('AppComponent ', () => {
  let appComponent: AppComponent ;
  beforeEach(() => {
    TestBed.configureTestingModule({});
    appComponent= TestBed.inject(AppComponent);
  });

  it('should allow mocking', () => {
    (appComponent as AppComponent).doSomethingRef = jasmine.createSpy('doSomethingRef ').and.returnValue(1);
    expect(guard.test()).toEqual(1);
  });
 }