【问题标题】:Can I assume that all databases will return a promise?我可以假设所有数据库都会返回一个承诺吗?
【发布时间】:2021-06-02 18:45:22
【问题描述】:

我正在和我的一个朋友设计一组单元和集成测试,但我们有一个疑问。至少,我们知道答案更有可能是真的。不过,我们想听听您的想法。

我们正在为 MongoDB 设计一个测试,我们希望在请求保存文档后收到一个承诺。到目前为止一切顺利。

如果我们改变数据库呢???我们是否可以确定所有数据库在查询时都会返回一个承诺?

我猜关于 _id,它取决于数据库,我们使用 MongoDB 中的 _id 进行测试。

我们在 Jest 中使用以下测试

            create://this method do exist on service, however, at the moment of testing, it is empty, just a placeholder
              jest.fn().mockImplementation((cat: CreateCatDto) =>
                Promise.resolve({ _id: 'a uuid', ...cat })
              )

我们的想法是设计不依赖数据库的后端,但出于测试和开发的原因,我们使用的是 MongoDB 和 PostgreSQL。

【问题讨论】:

  • 如果你想避免依赖具体的接口,那么不要直接耦合到那个接口。询问是否“所有数据库都会返回承诺”是没有意义的,数据库不返回承诺。用 JavaScript 编写的数据库可能返回 Promise,但 Promise 只是从函数返回异步结果的众多方法之一。由这些库的作者决定使用哪种方法(如果有的话)。

标签: postgresql mongodb unit-testing javascript


【解决方案1】:

请记住,promise 一词并不作为所有数据库的概念存在,并且不可能为所有数据库的问题提供结论性答案。

话虽如此,如果 promise 是指插入新数据后的 主键身份(一般数据库术语),那么答案是否定的,不能保证,即使在 PostgreSQL 上你也不能这样做。即使在 PostgreSQL 中,表也可能在没有这些约束的情况下存在。

否则,如果 promise 是指以过程或功能语言(如 JavaScript)(如更新中的示例代码所示)的具体概念,那么是的,您应该始终收到promise 对象,如果您的应用程序代码适当地利用了异步调用。

但这将与异步调用是什么无关,它是直接的数据库(也不管是什么数据库系统)、API 端点或另一段应用程序代码。此外,在这种情况下,您的问题(或任何后续问题)会更适合StackOverflow.com

【讨论】:

  • @JorgeGuerraPires 不幸的是,这个论坛比 StackOverflow 更具体,因为适当的主题非常关注数据库。虽然您的问题确实涉及数据库,并且 可能 在这里没问题,但它绝对更适合与更通用的编程相关的 StackOverflow,而且您的问题更多的是特定于 JavaScript 编程语言的功能(这不是很此处相关)。无论如何,不​​用担心,我很高兴能帮上忙。将来如果您不确定,将其发布到 StackOverflow 是一个好的开始,如果它更适用于此处,他们会将其移至此处。 ?
  • 谢谢,他们现在太生气了!! ?
  • 如果您的应用程序代码适当地使用异步调用,您应该始终收到一个 Promise 对象”这不一定是正确的。虽然趋势是变得更加真实。在 Node.js 中处理异步内容的旧式方法是使用 (err, data) 回调。仍然有一些 API 使用它。虽然,他们越来越多地添加了 Promise 支持。那些(还)没有的很容易converted to a promise。甚至还有a utility in Node.js
  • 如果你的意思是主键或身份” - 我从未听说过这种用法。你能链接一些来源吗?
  • @Bergi 抱歉,这听起来令人困惑,这是基于 OP 在 DBA.StackExchange 上提出问题时最初写的。我认为他的问题现在更清楚了,我可能可以清理我的答案,并将 VLAZ 的观点也纳入其中。
【解决方案2】:

我可以假设所有数据库都返回一个承诺吗?

没有。大多数(如果不是全部)数据库线路协议都是同步的,这意味着客户端会阻塞,直到它得到响应。即使是公开某种 RESTful API 的数据库也是同步的,因为 HTTP。

某些客户端驱动程序可能会包装此同步逻辑并通过返回诸如 JavaScrpt Promises 或 Java Futures 之类的东西来展示异步行为,但这完全取决于您选择使用的驱动程序实现。

【讨论】:

    猜你喜欢
    • 2020-05-12
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2015-06-05
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多