Как сказано в названии, я хочу протестировать класс TypeScript, который я написал с помощью Jasmine (по крайней мере, я предполагаю, что не могу напрямую протестировать файл .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"
}
}
Обновлять
Я заменил target в tsconfig.json на "ES2016", в результате получился немного другой movie.js. Я обновил код соответствующим образом. К сожалению, ошибка осталась прежней.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В вашем spec / movieSpec.js попробуйте изменить инструкцию require на:
const Movie = require('../dist/movie').Movie;
Я думаю, что ваш оператор require не возвращает фактический класс Movie. Вы также можете проверить это, проверив, каково фактическое значение вашего Movie const.
Вот и все! Не могу поверить, что сам не пришел к такому выводу. Когда я сейчас смотрю на
exports.Movie = Movie;изmovie.js, это становится очевидным. Большое спасибо! Кстати, можно по-другому написать эту инструкциюrequire? Полагаю, я не могу использовать здесьimportвместоrequire?