如何在 Angular 单元测试中 mock/spy 导入函数

How to mock/spy an imported function in Angular unit testing

假设我有一个 angular 6 组件,其方法 test 其中 returns 一些值:

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 };
}

是否可以在单元测试中模拟或监视这个函数(这样我就可以控制它的返回值)?或者我必须改变我在组件中的方法吗?

请注意:doSomething() 可以是一个 lodash 函数、一个 const、一个 class 等。我只是尽量让示例保持简单。


我尝试过的事情:

在您的规范文件中,以这种方式导入助手:

import * as helper from './helper';

并且在您的 it() 中,您可以监视辅助对象和 return 请求的值:

spyOn(helper, 'doSomething').and.returnValue({});

无法模拟外部函数,但您可以执行以下操作,效果很好。

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);
  });
 }