Предыстория
Я играю в игру под названием screeps , игра позволяет вам написать бота / ai, который выполняет действия в игре. Это достигается путем загрузки кода, который выполняется в среде с доступными константами, классами и определениями.
Эти определения определены в следующем пакете
https://www.npmjs.com/package/@types/screeps
Теперь я пишу код в машинописном тексте и использую накопительный пакет для его компиляции. Я использую следующий начальный пакет.
https://github.com/screepers/screeps-typescript-starter
Я пытаюсь издеваться над следующей структурой
https://www.npmjs.com/package/@fluffy-spoon/substitute
Задача
При запуске в mocha, мне приходится заглушать / высмеивать функциональность среды из игры, она не существует при запуске в тестовой среде.
Мне удалось высмеять константы и заставить их бегать в мокко с помощью других людей. но теперь я застрял в расширении прототипа для объекта Creep
prototypes.ts
Object.defineProperty(Creep.prototype, "task", {
get() {
... logic
},
set(task: ITask | null) {
... logic
}
})
тест
import "../constants"
import "../../src/tasks/prototypes"
import { Task } from "tasks/Task"
import { Game, Memory } from "./mock"
import { assert } from "chai"
import { Substitute, Arg } from "@fluffy-spoon/substitute"
describe("tasks", () => {
before(() => {
// runs before all test in this block
})
beforeEach(() => {
// runs before each test in this block
// @ts-ignore : allow adding Game to global
global.Game = _.clone(Game) as Game
// @ts-ignore : allow adding Memory to global
global.Memory = _.clone(Memory)
})
it("Creep should have extended prototyped", () => {
const testCreep = Substitute.for<Creep>()
const task = testCreep.task
assert.isNotNull(task)
})
})
Когда я запускаю тест, я получаю следующую ошибку
... \ \ расстояние тест-unit.bundle.js: 3324
} (Chai));
^
ReferenceError: Creep не определен
И это имеет смысл, поскольку класс ползучести не был определен игровым движком или тестовой средой, поэтому при импорте prototypes.ts не удается его расширить.
Но я не уверен, как на самом деле заставить его работать.