5
const Datastore = require('@google-cloud/datastore');
const datastore = Datastore();

function listTasks(res) {
  const query = datastore.createQuery('Test');
  datastore.runQuery(query)
    .then((results) => {
      const tasks = results[0];
      tasks.forEach((task) => {
        const taskKey = task[datastore.KEY];
        console.log(taskKey.id, task);
      });
      res.send(tasks);
    })
    .catch((err) => {
      console.error('ERROR:', err);
    });
}

我想对上面的代码进行单元测试,但我不知道如何模拟/存根谷歌云数据存储对象/方法。例如,我想模拟/存根 datastore.createQuery('Test'),但不知道如何。

4

2 回答 2

6

你无能为力。要么自己模拟整个数据存储,要么使用本地模拟器,要么只模拟每个测试用例所需的方法。

第一种方法可能是费力且复杂的,但会保证最佳的响应时间和测试速度。

第二种方法也可以,但在我的实践中,这并不比项目中的真实数据存储快。我的意思是,我机器中的本地仿真器响应时间约为 30 毫秒 - 400 毫秒,这与使用远程数据存储实例几乎相同。不知道为什么,可能是我做错了什么。你至少可以试试。

第三种方法,将介于两者之间,但您将开始测试实现而不是行为,这样的测试变得无用。但是,这只是我对这种方法的看法。

还有一种方法,第四种方法是分解这种方法,所以它们没有数据库通信代码,只有算法部分。测试这样的代码,而不是调用 db 方法的代码。

于 2017-11-04T06:37:26.457 回答
5

所以我自己遇到了这个问题,这就是我解决它的方法。

假设您的目录如下所示:

+-- node_modules
+-- src
|   +-- service.js
+-- package.json

并且您的service.js文件正在使用 GCP 数据存储,即

const Datastore = require('@google-cloud/datastore')
const datastore = Datastore()

//some other code ...

您可以做的是在该__mocks__目录附近创建一个node_modules目录。

+-- __mocks__
|   +-- @google-cloud
|   |   +-- datastore.js
|
+-- node_modules
+-- src
|   +-- service.js
+-- package.json

datastore.js 至少应具有以下内容:

// datastore.js
function Datastore() {
    return ""
}

module.exports = Datastore;

然后使用Jest 配置对象中的属性引用datastore.js您的文件。package.jsonmoduleNameMapper

//package.json
...
  "jest": {
    "moduleNameMapper": {
      "@google-cloud/datastore": "<rootDir>/__mocks__/@google-cloud/datastore.js"
    }
  }

<rootDir>相当于你的 package.json 文件所在的目录。

希望有帮助!

于 2019-04-25T20:11:46.597 回答