[英]Testing REST API - req.body undefined (Node.js / Express / Mocha / Supertest)
[英]Testing Node.js API that uses Sequelize with Mocha/Expect/Supertest
我一直在努力與Postgres的工作的API的NodeJS和我在與一個問題測試的expect
。 無論類型如何,Sequelize都將所有字段作為字符串值返回。
使用.toMatchObject
,將引發錯誤,因為在原始對象和數據庫id
中,該值是數字值,但將其作為字符串返回。 小數也一樣。
有沒有辦法獲取數據的存儲方式,而不是字符串形式?
有沒有其他方法可以檢查對象是否匹配,而不必將每個屬性解析為與原始屬性相同的類型?
我在網上閱讀時嘗試使用raw:true
,但沒有用。 節點版本為9.9,預期版本為22.4.3,續集版本為4.37
測試失敗的代碼如下:
it('should create new zgrada', (done) => {
var newZgrada = {
sifra_zgrade: 1006,
ulica: "Derpa derpsona",
kucni_broj: "77",
dodatak_na_kucni_broj: "A"
};
request(app)
.post('/zgrade')
.send(newZgrada)
.expect(200)
.expect((res) => {
expect(res.body.zgrada).toMatchObject(newZgrada);
})
.end((err, res) => {
if (err) {
return done(err);
}
db.zgrada.findAll({
where: {
sifra_zgrade: newZgrada.sifra_zgrade
}
}).then((zgrada) => {
expect(zgrada.length).toBe(1);
expect(zgrada).toMatchObject(newZgrada);
done();
}).catch((e) => done(e));
});
});
收到的錯誤是:
1)POST / zgrada應該創建新的zgrada:錯誤:Expect(received).toMatchObject(expected)
Object {
"dodatak_na_kucni_broj": "A",
"kucni_broj": "77",
- "sifra_zgrade": 1006,
+ "sifra_zgrade": "1006",
"ulica": "Derpa derpsona",
}
當我用.toBe()
交換toMatchObject()
,它可以工作,但是我必須分別遍歷每個屬性,然后將數字屬性首先轉換為字符串,這對於具有不同模型和許多屬性的較大項目不切實際。
編輯:模型定義(一些屬性被忽略但與錯誤無關):
module.exports = (sequelize, DataTypes) => {
var Zgrada = sequelize.define('zgrada', {
sifra_zgrade: {
type: DataTypes.NUMERIC(0, 4),
unique: true,
primaryKey: true,
allowNull: false
},
ulica: {
type: DataTypes.STRING,
allowNull: false
},
postanski_broj: {
type: DataTypes.STRING
},
kucni_broj: {
type: DataTypes.STRING
},
dodatak_na_kucni_broj: {
type: DataTypes.STRING
}
}
發布方法:
router
.post("/", async (req, res) => {
try {
var body = req.body;
var zgrada = await db.zgrada.create({
sifra_zgrade: body.sifra_zgrade,
ulica: body.ulica,
kucni_broj: body.kucni_broj,
dodatak_na_kucni_broj: body.dodatak_na_kucni_broj,
});
res.send({
zgrada
});
} catch (e) {
res.status(400).send(e);
}
});
}
謝謝你的幫助
無論類型如何,Sequelize都將所有字段作為字符串值返回。
Sequelize使用pg
模塊作為postgres的橋梁。 在pg
,出於與JS中parseInt
的安全性和精度有關的原因,設計將Decimal
(別名: Numeric
)類型作為String
值返回。 有關更多信息,請參見本期關於node-postgres Github的問題 。
有沒有辦法獲取數據的存儲方式,而不是字符串形式?
從Sequelize 4.32.5版開始,有關類型解析的基礎依賴性已更改,並且存在一個未解決的問題,與此處鏈接的問題相同 。
簡而言之,當前的設置您無能為力。
其他解決方案:
1)盡可能使用其他類型,例如DataTypes.UUID
或DataTypes.Integer
。 特別是考慮到sifra_zgrade
似乎充當主鍵/ id列,則似乎可以更改類型。
2)回滾到Sequelize版本4.23.3,並僅當在安全的小數精度范圍內操作時,才手動更改pg-types
解析小數的方式:
var pg = require('pg');
pg.types.setTypeParser(1700, 'text', parseFloat);
有沒有其他方法可以檢查對象是否匹配,而不必將每個屬性解析為與原始屬性相同的類型?
據我了解,解決方案將不得不使用基礎的類型轉換比較( ==
)而不是嚴格的相等比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.