在不使用数据库的情况下为服务编写单元测试

Posted

技术标签:

【中文标题】在不使用数据库的情况下为服务编写单元测试【英文标题】:Writing unit tests for services in feathers without using a database 【发布时间】:2020-04-29 10:52:27 【问题描述】:

我想为羽毛服务编写一些单元测试。 我希望这个测试完全独立运行,这意味着我不想使用数据库。 这是我使用 sequelize 的服务的示例 sn-p: src/services/messages/messages.service.js

// Initializes the `messages` service on path `/messages`
const createService = require('feathers-sequelize');
const createModel = require('../../models/messages.model');
const hooks = require('./messages.hooks');
const filters = require('./messages.filter');

module.exports = function (app) 
  const app = this;
  const Model = createModel(app);
  const paginate = app.get('paginate');
  const options = 
    name: 'messages',
    Model,
    paginate
  ;

  // Initialize our service with any options it requires
  app.use('/messages', createService(options));

  // Get our initialized service so that we can register hooks
  const service = app.service('messages');

  service.hooks(hooks);

  if (service.filter) 
    service.filter(filters);
  
;

我可能会尝试使用库 sequelize-test-helpers 模拟数据库,但我不确定这将如何与羽毛结合使用。 这就是我当前在 typescript 中对该服务的测试的样子: src/test/services/messages.test.ts

import assert from 'assert';
import  app  from '../../src/app';

describe('\'messages\' service', () => 

  before(() => 
  // maybe add an entry to the mocked database
  );

  after(() => 
  // maybe delete that entry
  );

  it('registered the service', () => 
    const service = app.service('messages');

    assert.ok(service, 'Registered the service');
  );

  it('returns a single record', async () => 
    // get result with id 1 (maybe added item in before-hook)
    const res = await service.get(1);
    should().exist(res);
    res.should.be.a('object');
    // more checks...
  );
);

第一个 'it(...)' 是由羽毛本身生成的,第二个 'it(...)' 显示了我希望测试具有的功能。 但问题是我不确定如何编写这个测试,以便服务不会使用原始数据库。 你们中有人知道如何在不使用实际数据库的情况下为羽毛服务编写测试吗? 提前致谢!

【问题讨论】:

一个本质上只是测试feathers-sequelize的单元测试有什么用?除非您尝试在 feathers-sequelize 之上测试其他功能,否则我想我在编写测试时看不到该实用程序仅验证 3rd 方库是否按照它所说的那样做。 好吧,我想测试我的应用程序的每一点,甚至是服务。我也可以做一些集成测试,但在我看来,这对于单个服务来说有点过分了 您是否查看过您正在使用的羽毛适配器的测试?通常他们已经很好地覆盖了单元测试。如果您不扩展服务,则可能无需重新发明***。 @floriannorbertbepunkt adapter tests 的问题在于他们正在使用新生成的服务:const app = feathers() .use('/people', memory( events ))。我想测试我自己的服务,例如:app.service('messages'),而不是新生成它。 【参考方案1】:

将环境设置为 TEST 并在配置中将数据库设置为 test.json 。如此处所示:https://docs.feathersjs.com/guides/basics/testing.html#test-database-setup

【讨论】:

毫不犹豫地添加一些从链接中提取的有用引用。这样,即使链接失效,您发布的内容仍然有效!

以上是关于在不使用数据库的情况下为服务编写单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mockito 为以下代码编写 junit 测试?

如何在不使用 Angular 的 spyOn 的情况下检查服务中的方法是不是在 Jasmine 单元测试中被调用?

如何在不污染全局命名空间的情况下公开 javascript 对象以进行单元测试

在不运行单元测试的情况下构建 Maven 项目

在没有启动应用程序的情况下在 SpringBoot 中编写单元测试

如何从单元测试运行 dropwizard 服务器