Jestを使ったテストの実装で困っています。

**a.ts**

```

    export const f1 = () => 'f1';
    export const f2 = () => f1();
    
```

**a.spec.ts**

```

    import * as a from './a'
    
    it('f1をstubしたい', () => {
      const f1Spy = jest.spyOn(a, 'f1').mockReturnValue('mocked');
      expect(a.f2()).toBe('mocked');  // Expected:'mocked', Actual:'f1'
      expect(f1Spy).toBeCalled();
    });
    
```

上記実装で、 `expect(a.f2()).toBe('mocked');`
のテストが通って欲しいのですが、mockされずにオリジナルの`f1()`が実行されてしまいます。

モジュールの一部をモックする方法はありますか？

* * *

## 追記

以下のようにf1とf2を別モジュール（別ファイル）にすると意図した動作になりましたが、できればf1とf2を同じモジュールに実装したいのでどなたかご存じの方教えて下さい。

**f1.ts**

```

    export const f1 = () => 'f1';
    
```

**a.ts**

```

    import { f1 } from './f1';
    export const f2 = () => f1();
    
```

**a.spec.ts**

```

    import * as f1 from './f1'
    import * as a from './a'
    
    it('f1をstubしたい', () => {
      const f1Spy = jest.spyOn(f1, 'f1').mockReturnValue('mocked');
      expect(a.f2()).toBe('mocked');
      expect(f1Spy).toBeCalled();
    });
    
```
CC BY-SA 4.0
2021-04-30T05:01:12.877
75585
2021-04-30T06:45:40.263
2021-04-30T06:45:40.263
3068
9185
question
javascript typescript テスト jestjs
Jestでモジュールの一部をモックする