【问题标题】:Unittesting / mocking google datastore in nodejs节点js中的单元测试/模拟谷歌数据存储
【发布时间】:2017-11-03 05:35:15
【问题描述】:
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'),但不知道如何。

【问题讨论】:

    标签: node.js unit-testing google-app-engine google-cloud-datastore google-cloud-node


    【解决方案1】:

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

    假设您的目录如下所示:

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

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

    const Datastore = require('@google-cloud/datastore')
    const datastore = Datastore()
    
    //some other code ...
    

    您可以在node_modules 目录旁边创建一个__mocks__ 目录。

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

    datastore.js 至少应包含以下内容:

    // datastore.js
    function Datastore() {
        return ""
    }
    
    module.exports = Datastore;
    
    

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

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

    &lt;rootDir&gt; 相当于你的 package.json 文件所在的目录。

    希望有帮助!

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 是的,我想要单元测试和集成测试(模拟器)。我想我将提取包含 datastore.method() 的一个衬里并模拟该函数。谢谢!
      • 投票,如果问题有帮助,如果它回答了您的问题,请接受。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多