Как вы издеваетесь и расширяете внешний определенный класс и его прототипы? - PullRequest
1 голос
/ 09 июля 2019

Предыстория

Я играю в игру под названием 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 не удается его расширить. Но я не уверен, как на самом деле заставить его работать.

1 Ответ

0 голосов
/ 09 июля 2019

Мне удалось запустить его, выполнив что-то в соответствии с тем, что у меня есть в определении констант

mock.ts

import { Substitute, Arg } from "@fluffy-spoon/substitute"

export const Game = Substitute.for<Game>()

const mockScreeps = () => {
  const g = global as any

  g.Game = Game
  g.Creep = (function() {
    function Creep() {}

    return Creep
  })()

  g.RoomObject = (function() {
    function RoomObject() {}

    return RoomObject
  })()

  g.RoomPosition = (function() {
    function RoomObject() {}

    return RoomObject
  })()
}

mockScreeps()

test

import "../constants"
import { Memory } from "./mock"
import { assert } from "chai"
import "../../src/tasks/prototypes"

describe("tasks", () => {
  before(() => {
    // runs before all test in this block
  })

  beforeEach(() => {
    // runs before each test in this block
    // @ts-ignore : allow adding Memory to global
    global.Memory = _.clone(Memory)
  })

  it("Creep should have extended prototyped", () => {
    const creep = new Creep("test")
    creep.memory = {
      task: {
        tick: 123,
        name: "dummy"
      }
    }

    const task = creep.task
    assert.isNotNull(task)
    if (task && creep.memory.task) {
      assert.isString(task.memory.name)
      assert.equal(task.memory.name, creep.memory.task.name)
    }

  })
})

Теперь он запускает мои тесты, мне просто нужно расширять макеты при создании тестов, которые используют что-то, что еще не смоделировано.

...