jcg*_*582 2 google-app-engine unit-testing node.js google-cloud-datastore google-cloud-node
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);
});
}
Run Code Online (Sandbox Code Playgroud)
我想对上面的代码进行单元测试,但是我不知道如何模拟/存根谷歌云数据存储对象/方法。例如,我想模拟/存根datastore.createQuery('Test'),但不知道如何。
您无能为力。自己模拟整个数据存储,使用本地仿真器,或仅模拟每个测试用例所需的方法。
第一种方法可能既费力又复杂,但是将保证最佳的响应时间和测试速度。
第二种方法也可以使用,但是在我的实践中,这种方法的运行速度并不比项目中的实际数据存储快。我的意思是,我的机器中本地仿真器的响应时间约为30毫秒-400毫秒,这几乎与使用远程数据存储实例相同。不知道为什么,也许我做错了。您至少可以尝试。
第三种方法将介于两者之间,但是您将开始测试实现而不是行为,并且这种测试变得毫无用处。但是,这只是我对这种方法的看法。
还有另一种方法,第四种方法是分解这种方法,因此它们没有数据库通信代码,只有算法部分。测试这样的代码,而不要测试调用db方法的代码。
小智 5
所以我只是自己遇到了这个问题,这就是我解决它的方法。
假设您的目录如下所示:
+-- node_modules
+-- src
| +-- service.js
+-- package.json
Run Code Online (Sandbox Code Playgroud)
并且您的service.js文件正在使用 GCP 数据存储,即
+-- node_modules
+-- src
| +-- service.js
+-- package.json
Run Code Online (Sandbox Code Playgroud)
您可以做的是创建一个与__mocks__目录相邻的node_modules目录。
+-- __mocks__
| +-- @google-cloud
| | +-- datastore.js
|
+-- node_modules
+-- src
| +-- service.js
+-- package.json
Run Code Online (Sandbox Code Playgroud)
datastore.js 应至少包含以下内容:
const Datastore = require('@google-cloud/datastore')
const datastore = Datastore()
//some other code ...
Run Code Online (Sandbox Code Playgroud)
然后使用Jest 配置对象中的属性引用datastore.js您的文件。package.jsonmoduleNameMapper
//package.json
...
"jest": {
"moduleNameMapper": {
"@google-cloud/datastore": "<rootDir>/__mocks__/@google-cloud/datastore.js"
}
}
Run Code Online (Sandbox Code Playgroud)
<rootDir> 相当于 package.json 文件所在的目录。
希望有帮助!
| 归档时间: |
|
| 查看次数: |
940 次 |
| 最近记录: |