首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Bookshelf.js和knex.js进行单元测试

使用Bookshelf.js和knex.js进行单元测试
EN

Stack Overflow用户
提问于 2015-01-08 20:53:12
回答 1查看 5.6K关注 0票数 22

我是Node的新手,正在做一个使用knex和书架的项目。我在单元测试我的代码时遇到了一点麻烦,我不确定我做错了什么。

基本上,我有一个模型(名为VorcuProduct),如下所示:

代码语言:javascript
复制
var VorcuProduct = bs.Model.extend({
    tableName: 'vorcu_products'
});

module.exports.VorcuProduct = VorcuProduct

以及一个函数,如果VorcuProduct在DB上不存在,则该函数将其保存。很简单。执行此操作的函数如下所示:

代码语言:javascript
复制
function subscribeToUpdates(productInformation, callback) {
  model.VorcuProduct
    .where({product_id: productInformation.product_id, store_id: productInformation.store_id})
    .fetch()
    .then(function(existing_model) {
        if (existing_model == undefined) {
            new model.VorcuProduct(productInformation)
                .save()
                .then(function(new_model) { callback(null, new_model)})
                .catch(callback);
        } else {
            callback(null, existing_model)
        }
    })
}

哪种方法是在不访问数据库的情况下进行测试的正确方法?我是否需要模拟fetch来返回一个模型或未定义的(取决于测试),然后对save执行相同的操作?我应该为此使用rewire吗?

正如你所看到的,我有点迷路了,所以任何帮助都将不胜感激。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-11-21 04:13:13

这实际上是一个很好的问题,它提出了单元测试的价值和局限性。

在这种特殊情况下,非存根逻辑非常简单--只是一个简单的if块,所以这是否值得进行单元测试是值得商议的,所以公认的答案是好的,并指出了小规模集成测试的价值。

另一方面,进行单元测试的练习仍然很有价值,因为它指出了代码改进的机会。通常,如果测试过于复杂,底层代码可能会使用一些重构。在这种情况下,很可能会重构出doesProductExist函数。从knex/bookshelf返回承诺,而不是转换为回调,也将是一个有用的简化。

但为了进行比较,下面是我对现有代码的真正单元测试的看法:

代码语言:javascript
复制
var rewire = require('rewire');
var sinon = require('sinon');
var expect = require('chai').expect;
var Promise = require('bluebird');
var subscribeToUpdatesModule = rewire('./service/subscribe_to_updates_module');

var subscribeToUpdates = subscribeToUpdatesModule.__get__(subscribeToUpdates);

describe('subscribeToUpdates', function () {
  before(function () {
    var self = this;
    this.sandbox = sinon.sandbox.create();
    var VorcuProduct = subscribeToUpdatesModule.__get__('model').VorcuProduct;

    this.saveStub = this.sandbox.stub(VorcuProduct.prototype, 'save');
    this.saveStub.returns(this.saveResultPromise);

    this.fetchStub = this.sandbox.stub()
    this.fetchStub.returns(this.fetchResultPromise);

    this.sandbox.stub(VorcuProduct, 'where', function () {
      return { fetch: self.fetchStub };
    })

  });

  afterEach(function () {
    this.sandbox.restore();
  });

  it('calls save when fetch of existing_model succeeds', function (done) {
    var self = this;
    this.fetchResultPromise = Promise.resolve('valid result');
    this.saveResultPromise = Promise.resolve('save result');
    var callback = function (err, result) {
      expect(err).to.be.null;
      expect(self.saveStub).to.be.called;
      expect(result).to.equal('save result');
      done();
    };
    subscribeToUpdates({}, callback);
  });

  // ... more it(...) blocks

});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27840634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档