Jasmine - 如何对使用静态方法导入另一个类的TypeScript类进行单元测试

时间:2017-09-12 00:26:23

标签: typescript ionic2 jasmine karma-jasmine

我有一个简单的TypeScript类(在我的Ionic应用程序中),它实现了一个简单的“类型”字典......

import { Utils } from './utils';

 export class Dictionary<T> {
   constructor(private noCase?: boolean, init?: Array<{ key: string; value:T; }>) {
    ....
   }
}

我为它写了一些非常简单的测试...

    import { Dictionary } from './dictionary';

    let dictionary : Dictionary<string> = null;
    describe('Dictionary', () => {
         beforeEach(() => {
            dictionary = new Dictionary<string>(true, []);
        });

      it('should have containsKey find a value added', () => {
          dictionary.add("a", "A Val");
          let exists = dictionary.containsKey("a");
          expect(exists).toBeTruthy()
         });
    });

当我运行测试时,我收到以下错误......

        Chrome 60.0.3112 (Windows 10 0.0.0) ERROR
      Uncaught TypeError: __WEBPACK_IMPORTED_MODULE_3__dictionary__.a is not a constructor
      at webpack:///src/shared/utils.ts:19:17 <- test-config/karma-test-shim.js:77758
    Chrome 60.0.3112 (Windows 10 0.0.0) ERROR
      Uncaught TypeError: __WEBPACK_IMPORTED_MODULE_3__dictionary__.a is not a constructor
      at webpack:///src/shared/utils.ts:19:17 <- test-config/karma-test-shim.js:77758
    Chrome 60.0.3112 (Windows 10 0.0.0): Executed 0 of 0 ERROR (0.422 secs / 0 secs)
    webpack: Compiling...

我的问题是我正在测试的课程中的Utils课程(Dictionary

这个Utils类只有一堆静态的“utils”方法,(字符串比较,格式化等)

    import * as moment from 'moment';
    import 'moment-duration-format';
    import * as _ from 'lodash';
    import { TranslateService } from 'ng2-translate';
    import { Dictionary } from './dictionary';
    .....


    export class Utils {
      public static guard(obj: any, name: string): void {
        if (obj == null || obj == undefined)
          throw (name + " must not be null!");
      }

       public static guardS(s: string, name: string): void {
        if (this.isNullorEmptyOrWhiteSpace(s))
          throw (name + " must not be null or empty!");
       }

      ...  etc
      }

我在DictionaryUtils中使用的唯一内容是静态guard方法(如上所示)。

有没有办法可以使用静态方法测试包含其他类的类?我可以模拟这个类的静态方法吗?

虽然上面的课程很简单,但我还有其他我想测试的东西,还包括这个静态Utils类。

提前感谢任何建议。

1 个答案:

答案 0 :(得分:1)

是的,您可以添加一个间谍来模拟Utils类中的guard方法。

spyOn(Utils, 'guard').and.returnValue(true);