我使用karma-jasmine,webpact运行单元测试。 我试图使用bookshelf在mysql数据库中插入一条记录。 我收到以下错误消息:
ReferenceError:未定义bookshelf 在module.exports.addCategoryWithProducts(app_serv / order / test / order.util.spec.js:94215:2) 在对象。 (app_serv /订单/测试/ order.util.spec.js:94059:3) 在ContextKarma.loaded(http://localhost:9876/context.js:151:12) TypeError:无法读取未定义的属性'then' 在对象。 (app_serv /订单/测试/ order.util.spec.js:94074:4)
TypeError:_this.driver.createConnection不是函数
我的代码:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#Modal1">Modal 1</a>
<a href="#Modal2">Modal 2</a>
<a href="#Modal3">Modal 3</a>
<div id="Modal">
<div>
<input type="text" id="textvalue">
</div>
<button>submit</button>
</div>
单位测试代码:
var knex = require('knex')({
client: 'mysql',
connection: {
host : 'localhost',
user : 'user1',
password : 'toto',
database : 'totoDb',
charset : 'utf8'
}
});
module.exports = require('bookshelf')(knex);
module.exports.addCategoryWithProducts = function(categoryToAdd) {
bookshelf.transaction(function(t) {
var products = categoryToAdd.products;
var tableProd = [];
//if (!req.params.idCategory || req.params.idCategory ==0) {
Category.forge({
name: categoryToAdd.name,
code: categoryToAdd.code,
tax_percentage: categoryToAdd.tax_percentage,
description: categoryToAdd.description
})
.save(null, { transacting: t })
.then(function(category) {
for (var i = 0; i < products.length; i++) {
tableProd.push({
barcode: products[ i ].barcode,
cip_13: products[ i ].cip_13,
category_id: category.id,
quantity: products[ i ].quantity,
retail_price: products[ i ].retail_price,
description: products[ i ].description,
name: products[ i ].name,
inn: products[ i ].inn,
kind: products[ i ].kind,
comment: products[ i ].comment,
status: products[ i ].status,
critical_threshold: products[ i ].critical_threshold,
max_threshold: products[ i ].max_threshold,
date_end: products[ i ].date_end
});
}
Products.forge(tableProd)
.invokeThen('save', null, { transacting: t })
.then(function(products) {
//console.log('inside insert of collection '+ JSON.stringify({category : category.toJSON(), produits: products}))
//res.json({error : false, data: {category : category.toJSON(), products: products}});
t.commit();
return Promise.resolve(category.related('products'));
})
.catch(function(err) {
return Promise.reject(err.message);
//console.log('Erreur dans Products.forge: ' + err.message);
res.status(500)
.json({ error: true, code: err.code, message: err.message });
})
})
.catch(function(err) {
return Promise.reject(err.message)
//console.log('Erreur dans Products.forge: ' + err.message);
//res.status(500).json({error: true, code : err.code, message: err.message});
})
});
}
在尝试了许多解决方案失败后,我决定寻求你的帮助。
答案 0 :(得分:0)
目前还不完全清楚你的代码库是如何工作的,但是从TypeError: Cannot read property 'then' of undefined
来看,你似乎没有正确地向单元测试返回一个承诺。
尝试更改
Products.forge(tableProd)
.invokeThen('save', null, { transacting: t })
.then(function(products) {
到
return Products.forge(tableProd)
.invokeThen('save', null, { transacting: t })
.then(function(products) {
您还可以简化承诺和交易处理:
t.commit()
,因为如果承诺解析,它将由Bookshelf自动调用return Promise.resolve(category.related('products'))
代替return category.related('products')
而不是return Promise.reject(err.message)
而不仅仅是return err.message
(但重新投掷会更好)