如何对将自己的创建封装在静态函数中的javascript ES6类进行单元测试?

Ton*_*y D 4 javascript graphql

在Dan Schafer的React Europe演讲(https://youtu.be/etax3aEe2dA?t=11m5s)中,他展示了一种在GraphQL服务器中处理授权的方法可以委托给业务逻辑层,其中每个业务对象类都有一个gen ()函数充当“单一来源”两个取和授权

他暗示这些类可能没有公共构造函数,从而使gen()成为实例化这些类之一的唯一方法。

作为C#开发人员,这将无法[轻松]进行单元测试。也许,我从字面上看还是以他为榜样。

在ES2015中,是否可以使用这种模式对业务逻辑进行单元测试?如果可以,请提供一个例子吗?


这是相关的问答,但并不能完全解决我的问题:

问:使用GraphQL,声明一个与GraphQL“类型”没有明显区别的支持模型“类”有什么好处或必要性?

答:https//stackoverflow.com/a/38209996/6439734

小智 5

我要采用的方法会因我要测试的内容而异:

  • 如果我要对授权逻辑本身进行单元测试,则几乎可以肯定地将这个逻辑分解为以下形式: Dan Schafer React Europe 2016 Talk的幻灯片中的代码示例现在,我将checkCanSee完全自己进行单元测试,传入一个伪造的Viewer对象和伪造的数据。

  • 如果我要对此类的一种实例方法中的逻辑进行单元测试;例如,如果我们有, class TodoItem { getItemSummary() { return this.data.title + "(" + this.data.author.name + ")"; } } 而我想对该逻辑进行单元测试,则有几种选择。在ES6中,我不知道有一种简单的方法可以使构造函数真正私有,因此我可以在单元测试中直接使用伪数据直接调用构造函数。用另一种语言,我希望能够公开一种仅在单元测试中可见的方法,该方法使我可以使用伪数据构造一个新对象。第三个想法是提取值得进行单元测试的逻辑: class TodoItem { getItemSummary() { return summarize(this.data.title, this.data.author.name); } } function summarize(title, name) { return title + "(" + name + ")"; } 现在我可以summarize自己进行单元测试了。

  • 如果我想对整个类进行端到端测试(包括测试gen功能),那么理想情况下,我将有一种方法来设置带垫片的Redis实例;一旦用伪造数据配置了填充片,就可以运行真实填充TodoItem.gen并测试生成的对象。

  • 如果我想对的实现进行单元测试gen,则可能需要使用上面相同的Redis垫片,并类似地checkCanSee使用https://facebook.github.io/jest/docs/manual- mocks.html ; 从那里,我可以监视对Redis的调用并checkCanSee确保它们符合预期,并测试Redis返回数据/返回null或checkCanSee返回true / false 的各种情况。

  • 如果我想对使用a的代码进行单元测试TodoItem(例如我们有一个renderTodoItem以a TodoItem作为参数的函数),那么我根本就不会使用实际的TodoItem实现,我会通过一个模拟TodoItem来确保对renderTodoItem不会偶然依赖的实现细节TodoItem

希望这可以帮助!