Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 测试微服务功能时模拟数据库_Javascript_Node.js_Database_Postgresql_Pg Promise - Fatal编程技术网

Javascript 测试微服务功能时模拟数据库

Javascript 测试微服务功能时模拟数据库,javascript,node.js,database,postgresql,pg-promise,Javascript,Node.js,Database,Postgresql,Pg Promise,我已经用pg promise创建了一个基本的NodeJS微服务。我已经通过express创建了包含API的路由文件(index.js): var express = require('express'); var router = express.Router(); var db = require('./../queries'); router.get('/api/puppy', db.getAllPuppies); router.post('/api/puppy', db.createP

我已经用pg promise创建了一个基本的NodeJS微服务。我已经通过express创建了包含API的路由文件(index.js):

var express = require('express');
var router = express.Router();

var db = require('./../queries');

router.get('/api/puppy', db.getAllPuppies);
router.post('/api/puppy', db.createPuppy);

module.exports = router;
然后,我在querys.js文件中添加了两个函数:

var promise = require('bluebird');

var options = {
  promiseLib: promise
};

var config = require('./config.json');
var pgp = require('pg-promise')(options);
var connectionString = process.env.DB_PATH || "postgres://postgres:xxxx@localhost:5432/postgres";
var db = pgp(connectionString);


function getAllPuppies(req, res, next) {
  db.any('select * from puppy')
    .then(function (data) {
      res.status(200)
        .json({
          status: 'success',
          data: data,
        });
    })
    .catch(function (err) {
      return next(err);
    });
}


function createPuppy(req, res, next) {
  db.none('insert into ' +
    'puppy(name, description) ' +
    'values(${name}, ${description})',
    req.body)
    .then(function () {
      res.status(200)
        .json({
          status: 'success',
        });
    })
    .catch(function (err) {
      return next(err);
    });
}


module.exports = {
  getAllPuppies,
  createPuppy,
};

该应用程序运行良好。我现在想以这样或那样的方式测试这两个函数,但我有点拘泥于模拟数据库的方式(我正在使用Mocha和类似于Beforeach的函数)来检索或创建数据。

一般来说,您有两个选择:

  • 在模拟数据库服务中使用依赖项注入和发送
  • 将测试环境配置为使用测试数据库,以便可以按原样使用数据库
  • 两者都是一个潜在的有用测试。第一个选项更像是单元测试,需要重构代码以使用依赖注入。然后,测试代码将注入某种模拟对象,该对象将具有与实际数据库对象相同的API。如果你对这类事情还不熟悉,谷歌将是你的朋友:单元测试和控制反转在概念上相当直截了当,但可能有很多细节需要掌握

    由于您还没有使用依赖项注入进行设置,接下来可以做的是配置您的测试环境以使用某种测试数据库。这将使它更像一个集成测试。您可以通过为测试设置不同的数据库来实现这一点,然后(仍然)必须重构代码以根据您的环境调整数据库连接凭据。同样,它在概念上很简单,但可能会有很多细节让人迷失

    如果您对代码测试还不熟悉,那么值得花些时间阅读相关内容并真正了解其工作原理。阅读控制反转和单元测试的主题。正确的代码测试对于任何代码库来说都是一个巨大的好处,但您确实必须从一开始就做好计划,因为正确的控制反转(这对于正确的代码测试是必要的)确实需要以不同的方式组织您的代码

    编辑以添加一些细节:

    一旦你计划并完成了代码测试,代码测试就会变得非常容易,但是开始测试并不是一件小事。最重要的问题是,您的代码必须以这样一种方式编写,以便实际规划未来的代码测试。在您的情况下,这意味着要么重构代码以使用实际的依赖项注入(node.js支持),要么至少根据环境调整数据库连接。后者更容易实现,但只允许有限的测试。最后,如果你想做正确的代码测试,你必须重构依赖注入/控制反转

    一旦您这样做了,您的下一步将是选择一个测试框架。我不知道node.js的默认值是多少,但大多数语言/框架都有一个相当标准的node.js,应该不难找到。可能会有不止一个选择,所以你可能会花一些时间选择一个最适合你的风格。一旦你选择了你的测试框架,你就必须阅读它是如何工作的,如何设置它,以及如何使用它


    一旦你完成了这些事情,你就可以真正开始测试了。第一次做这件事需要做很多工作,但100%的努力是值得的。

    一般来说,你有两个选择:

  • 在模拟数据库服务中使用依赖项注入和发送
  • 将测试环境配置为使用测试数据库,以便可以按原样使用数据库
  • 两者都是一个潜在的有用测试。第一个选项更像是单元测试,需要重构代码以使用依赖注入。然后,测试代码将注入某种模拟对象,该对象将具有与实际数据库对象相同的API。如果你对这类事情还不熟悉,谷歌将是你的朋友:单元测试和控制反转在概念上相当直截了当,但可能有很多细节需要掌握

    由于您还没有使用依赖项注入进行设置,接下来可以做的是配置您的测试环境以使用某种测试数据库。这将使它更像一个集成测试。您可以通过为测试设置不同的数据库来实现这一点,然后(仍然)必须重构代码以根据您的环境调整数据库连接凭据。同样,它在概念上很简单,但可能会有很多细节让人迷失

    如果您对代码测试还不熟悉,那么值得花些时间阅读相关内容并真正了解其工作原理。阅读控制反转和单元测试的主题。正确的代码测试对于任何代码库来说都是一个巨大的好处,但您确实必须从一开始就做好计划,因为正确的控制反转(这对于正确的代码测试是必要的)确实需要以不同的方式组织您的代码

    编辑以添加一些细节:

    一旦你计划并完成了代码测试,代码测试就会变得非常容易,但是开始测试并不是一件小事。最重要的问题是,您的代码必须以这样一种方式编写,以便实际规划未来的代码测试。在您的情况下,这意味着要么重构代码以使用实际的依赖项注入(node.js支持),要么至少根据环境调整数据库连接。后者更容易实现,但只允许有限的测试。最后,如果你想做正确的代码测试,你必须重构依赖注入/控制反转

    一旦您这样做了,您的下一步将是选择一个测试框架。我不知道node.js的默认设置是什么,但大多数语言都是这样/
    var options = {
       // Use a custom promise library, instead of the default ES6 Promise:
       promiseLib: promise,
       // Extending the database protocol with our custom repositories:
       extend: obj => {
    
         // Do not use 'require()' here, because this event occurs for every task
         // and transaction being executed, which should be as fast as possible.
         obj.users = repos.users(obj, pgp);
         obj.products = repos.products(obj, pgp);
    
         // Alternatively, you can set all repositories in a loop:
         //
         // for (var r in repos) {
         //    obj[r] = repos[r](obj, pgp);
         // }
        }
    
    };