簡體   English   中英

測試將Sequelize與Mocha / Expect / Supertest結合使用的Node.js API

[英]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.UUIDDataTypes.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM