网站搜索

javascript - 使用 Jasmine 测试 TypeScript 生成的类


正如标题所说,我想使用 Jasmine 测试我编写的 TypeScript 类(至少我认为我不能直接测试 .ts 文件?)。我猜原因可能是 TypeScript 编译 .js 文件的方式。

所以当我运行 jasmine spec/movieSpec.js 时,我得到了以下错误:

Suite error: Movie
  Message:
    TypeError: Movie is not a constructor
  Stack:
        at <Jasmine>
        at Suite.<anonymous> (/Users/user/Library/Mobile Documents/com~apple~CloudDocs/Coding/TypeScript/mediaparser/spec/movieSpec.js:4:15)
        at <Jasmine>
        at Object.<anonymous> (/Users/user/Library/Mobile Documents/com~apple~CloudDocs/Coding/TypeScript/mediaparser/spec/movieSpec.js:3:1)
        at Module._compile (module.js:652:30)
        at Object.Module._extensions..js (module.js:663:10)
        at Module.load (module.js:565:32)
        at tryModuleLoad (module.js:505:12)
        at Function.Module._load (module.js:497:3)
No specs found
Finished in 0.004 seconds
Randomized with seed 40039 (jasmine --random=true --seed=40039)

这是我的其他文件:

src/movie.ts

export class Movie {
  private name: string;

  constructor(name: string) {
    this.name = name.replace(".mkv", "");
  }
}

dist/movie.js(生成的)

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class Movie {
    constructor(name) {
        this.name = name.replace(".mkv", "");
    }
}
exports.Movie = Movie;

spec/movieSpec.js

const Movie = require('../dist/movie');

describe("Movie", function() {
  let movie = new Movie("aMovie.mkv");

  it("removes the file extension", function() {
    expect(movie.name).toEqual("aMovie")
  });
});

package.json

{
  "dependencies": {
    "@types/jasmine": "^2.8.9",
    "ts-node": "^7.0.1"
  }
}

更新 我已将 tsconfig.json 中的 target 改为 "ES2016",这导致 movie.js 略有不同。我已相应地更新了代码。不幸的是,错误仍然相同。

答案#1

在你的 spec/movieSpec.js 中,尝试将 require 语句更改为:

const Movie = require('../dist/movie').Movie;

我认为你的 require 语句并没有返回实际的 Movie 类。你也可以通过检查你的 Movie 常量的实际值来验证这一点。