我是Node的新手,正在做一个使用knex和书架的项目。我在单元测试我的代码时遇到了一点麻烦,我不确定我做错了什么。
基本上,我有一个模型(名为VorcuProduct),如下所示:
var VorcuProduct = bs.Model.extend({
tableName: 'vorcu_products'
});
module.exports.VorcuProduct = VorcuProduct
以及一个函数,如果VorcuProduct在DB上不存在,则该函数将其保存。很简单。执行此操作的函数如下所示:
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吗?
正如你所看到的,我有点迷路了,所以任何帮助都将不胜感激。
谢谢!
发布于 2016-11-21 04:13:13
这实际上是一个很好的问题,它提出了单元测试的价值和局限性。
在这种特殊情况下,非存根逻辑非常简单--只是一个简单的if
块,所以这是否值得进行单元测试是值得商议的,所以公认的答案是好的,并指出了小规模集成测试的价值。
另一方面,进行单元测试的练习仍然很有价值,因为它指出了代码改进的机会。通常,如果测试过于复杂,底层代码可能会使用一些重构。在这种情况下,很可能会重构出doesProductExist
函数。从knex/bookshelf返回承诺,而不是转换为回调,也将是一个有用的简化。
但为了进行比较,下面是我对现有代码的真正单元测试的看法:
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
});
https://stackoverflow.com/questions/27840634
复制相似问题