【问题标题】:Unit testing Loopback models单元测试环回模型
【发布时间】:2016-10-24 23:32:40
【问题描述】:

使用 Loopback,我们创建了一些自定义的远程方法,并且我们希望对该逻辑进行单元测试。我想要完成的是只加载一个模型,而不是我们所有的模型,并对那个模型的自定义远程方法进行单元测试。

我们可以将此模型连接到内存数据库(在我们的例子中而不是 Postgres),但不知何故,我需要告诉 Loopback 这个隔离模型,而不使用 Loopback 引导。 (如果我们使用标准的 Loopback 启动(app.boot()),它将加载我们所有的模型和整个 shebang,我认为我们应该避免出于隔离目的)。

我们在一个正在进行的单元测试中设置了这个设置:

  const supertest = require('supertest');

  //load the schema for the model
  const ContactSchema = require(path.resolve(projectRoot + '/server/models/contact.json'));

  const opts = {
    strict: true
  };

  const dataSource = loopback.createDataSource({
    connector: loopback.Memory
  });


  const Contact = dataSource.createModel('Contact', ContactSchema, opts);

  //load remote methods for this model
  require(path.resolve(projectRoot + '/server/models/contact.js'))(Contact);


  const app = loopback();


  this.it.cb('test contact', t => {

    supertest(app).get('/api/Contacts')
      .expect(200)
      .end(function (err, res) {
        if (err) {
          t.fail(err);    // we naturally get a 404, because the model hasn't been attached to this Loopback server
        }
        else {
          t.done();
        }
      });

  });

因此,我想加载模型架构和模型逻辑,然后以隔离方式将其附加到 Loopback 应用,而不是使用 Loopback 启动。

我们可以使用 Loopback 调用来将此模型附加到 Loopback 服务器/应用程序吗?

我正在寻找这种类型的电话:

app.useModel(Contact);

基本上我想做的是这样的:

app.models.Contact = Contact;

但这绝对是错误的方法 - 只是寻找正确的 API 调用。

也许这是正确的选择?

Contact.attachTo(loopback.memory());

【问题讨论】:

  • isolation purposes 是什么意思?使用环回引导并仅测试特定模型没有任何问题。
  • 严格意义上的单元测试可能意味着您应该尽可能地隔离事物,甚至可能不使用实时服务器;但我很难在不启动服务器的情况下测试模型代码 w loopback boot
  • 再说一次,我个人认为单元测试是浪费时间
  • 我同意你的观点,但它更多的是集成测试我们在测试环回 API 时试图实现的目标。在这种情况下,最好在尽可能接近生产环境的地方启动服务器,使用 loopback-boot 等。
  • 几乎 100% 同意

标签: node.js loopbackjs


【解决方案1】:

免责声明:我是 LoopBack 维护者,也是 loopback-boot@2 的原作者

设置模型的规范方法(也被 loopback-boot 在后台使用)是调用app.registry.createModel(json),然后调用app.model(ModelCtor, config)

在您的特定情况下:

const app = loopback();
// Consider using local per-app registry of models to avoid
// interference between tests. By default, all LoopBack apps
// share the same global registry (one per process)
// const app = loopback({ localRegistry: true });

// create in-memory datasources
app.dataSource('db', { connector: 'memory' });

//load the schema for the model
const ContactSchema = require(path.resolve(projectRoot + '/server/models/contact.json'));

const Contact = app.registry.createModel(ContactSchema);

//load remote methods for this model
require(path.resolve(projectRoot + '/server/models/contact.js'))(Contact);

// Caveat lector: the configuration may contain more than just dataSource,
// It may be safer to read the model configuration from "server/model-config"
// and override "dataSource" property.
app.model(Contact, { dataSource: 'db' });

// setup REST API
app.use('/api', loopback.rest());

// now we are good to start testing

const supertest = require('supertest');


this.it.cb('test contact', t => {

  supertest(app).get('/api/Contacts')
    .expect(200)
    .end(function (err, res) {
      if (err) {
        t.fail(err);    // we naturally get a 404, because the model hasn't been attached to this Loopback server
      }
      else {
        t.done();
      }
    });

});

我发现这种方法有两个可能的警告:

  • 如果您的自定义远程方法正在访问其他/相关模型,则此设置将失败,因为这些模型不可用。
  • 您的服务器没有在server/middleware.json 中配置任何中间件,也没有从引导脚本中添加任何其他内容。

我个人建议您尝试使用 loopback-boot,但覆盖 dataSources 和要在应用程序中配置的模型列表。大致如下:

const app = loopback();
boot(app, {
  appRootDir: path.resolve('../server'),
  env: 'unit-test',
  // Alternatively, the "dataSources" configuration for tests
  // can be provided in "server/datasources.unit-test.json"
  dataSources: {
    db: {
      connector: 'memory'
    }
  },
  models: {
    Contact: {
      // as I mentioned before, it's probably better to load this section
      // from "server/model-config.json"
      dataSource: 'db'
    }
  },
});

这是因为 loopback-boot 延迟加载模型,即仅在应用程序及其父项中配置的模型。

【讨论】:

    猜你喜欢
    • 2019-06-21
    • 2015-06-24
    • 2017-12-19
    • 2010-12-26
    • 1970-01-01
    • 2015-06-25
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多