【问题标题】:Factory class creates untyped objects工厂类创建无类型对象
【发布时间】:2020-02-29 21:13:07
【问题描述】:

我有一家工厂。它的目的是促进依赖注入。它看起来像:

import SomeImportantObject from "./SomeImportantObject"
import DataInterface from "./DataInterface"

class NoodleFactory {
  this.dependency: SomeImportantObject
  constructor(dependency: SomeImportantObject) {
    // Dependencies.
    this.dependency = dependency;
  }

  create(data: DataInterface) {
    return new Noodle(data, this.dependency);
  }
}

我正在为它创建一个测试,以确保它正确地创建了对象。该测试非常类似于:

data = {
  // Data.
}

mockDependency = "a mocked dependency."

testNoodleFactory = new NoodleFactory(mockDependency);

const expected = new Noodle(data, mockDependency);
const actual = testNoodleFactory.create(data);

test("Factory creates noodles", () => {
  expect(actual).toMatchObject(expected);
});

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

    @@ -1,6 +1,6 @@
    - Noodle {
    + Object {

所有内部数据匹配。

是什么导致对象类型不同?

【问题讨论】:

  • 整个示例充满了隐含的任何和未定义的引用(即类型错误),但您担心类型安全?您实际上想在这里实现什么目标?
  • 该示例是实际代码的快速表示。我会让它更健壮。
  • playground 表明工厂的 create 方法确实返回了正确的类型。 Jest 的toMatchObject 是关于匹配对象属性的子集。我再重复一遍:你的实际问题是什么?
  • 据我所知,测试完全是多余的,因为它只是复制了类型检查器已经在做的工作。即使在编辑之后,我仍然不明白你在这里追求什么。你只是想确保它是一个 Noodle 实例?
  • 好吧(请参阅我上面评论中的链接),但同样,这是多余的。这就是类型检查器的用途。不要用无用的测试弄乱你的测试套件。但是,是的,toMatchObject 并没有像您认为的那样做。请务必阅读文档。

标签: typescript jestjs ts-jest


【解决方案1】:

使用console.log 检查每次调用返回的内容。

推理你的代码(不执行它),我看不出对此的解释。

我快速浏览了 Jest 源代码。对象匹配器在这里:https://github.com/facebook/jest/blob/master/packages/expect/src/matchers.ts#L878

它使用这里的iterableEqualitysubsetEquality 测试: https://github.com/facebook/jest/blob/master/packages/expect/src/utils.ts

toMatchObject 检查它是否是一个对象,它们是否具有相同的构造函数(看起来像是失败的测试),然后您与之比较的对象是否具有您正在测试的对象的键的子集。

我会首先查看从 Noodle 工厂返回的对象的构造函数。

如果您在 GitHub 存储库中创建 MRE,我会检查它并跟踪代码执行(或者您可以这样做 - 只需在 node_modules 的 Jest 中注入 console.log 语句)。

【讨论】:

  • 嘿,很高兴这对您有所帮助 - 结果如何?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多