代码之家  ›  专栏  ›  技术社区  ›  Sevenless

如何在jasmine测试中模拟导出的typescript函数?

  •  7
  • Sevenless  · 技术社区  · 6 年前

    我试图在Jasmine测试中模拟从typescript文件导出的函数。我希望以下内容可以模拟导入的 foo 并返回条形规格中的值1。

    这个模拟似乎没有必要,所以我显然遗漏了一些东西。如何修复此示例?

    演示。ts:

    export function foo(input: any): any {
      return 2;
    }
    
    export function bar(input: any): any {
      return foo(input) + 2;
    }
    

    演示。ts规范:

    import * as demo from './demo';
    
    describe('foo:', () => {
      it('returns 2', () => {
        const actual = demo.foo(1);
        expect(actual).toEqual(2);
      });
    });
    
    describe('bar:', () => {
      // let fooSpy;
      beforeEach(() => {
        spyOn(demo, 'foo' as any).and.returnValue(1); // 'as any' prevents compiler warning
      });
    
      it('verifies that foo was called', () => {
        const actual = demo.bar(1);
        expect(actual).toEqual(3); // mocked 1 + actual 2
        expect(demo.foo).toHaveBeenCalled();
      });
    });
    

    故障:

    • 预计4等于3。
    • 应已调用spy foo。
    2 回复  |  直到 6 年前
        1
  •  4
  •   JJWesterkamp    6 年前

    从…起 this issue on Github :您希望如何在实际实现中使用spied-on函数?

    你的 bar 实现调用 实际执行情况 属于 foo ,因为它直接引用它。在另一个模块中导入时,将创建具有新引用的新对象:

    // This creates a new object { foo: ..., bar: ... }
    import * as demo from './demo';
    

    这些引用仅存在于导入的模块中。当你打电话的时候 spyOn(demo, 'foo') 正在使用的就是这个参考。您可能希望在您的规范中尝试此功能,测试很可能会通过:

    demo.foo();
    expect(demo.foo).toHaveBeenCalled();
    

    期待 酒吧 嘲笑某人 foo公司 真的不可能。相反,尝试治疗 酒吧 好像它有自己的实现 foo公司

        2
  •  4
  •   Sevenless    6 年前

    杰弗里的回答帮助我走上了正确的道路。

    要附加间谍,请将其附加到正确的参考 foo 产品代码需要稍作更改。 foo() 应称为 this.foo()

    下面的模式适用于测试(并且比我之前使用的复杂工作环境干净得多)。

    演示。ts:

    export function foo(input: any): any {
      return 2;
    }
    
    export function bar(input: any): any {
      return this.foo(input) + 2;
    }
    

    演示。ts规范:

    import * as demo from './demo';
    
    describe('foo:', () => {
      it('returns 2', () => {
        const actual = demo.foo(1);
        expect(actual).toEqual(2);
      });
    });
    
    describe('bar:', () => {
      // let fooSpy;
      beforeEach(() => {
        spyOn(demo, 'foo' as any).and.returnValue(1);
      });
    
      it('verifies that foo was called', () => {
        const actual = demo.bar(1);
        expect(actual).toEqual(3);
        expect(demo.foo).toHaveBeenCalled();
      });
    });
    
    推荐文章