使用Jest进行单元测试时,“FIRESTORE INTERNAL ASSERTION FAILED: Unexpected state”错误。

18

我正在为我的Node.js和Express REST API设置jest测试套件,我正在使用@firebase/testing模块来初始化一个测试应用程序,但是当我尝试执行任何与数据库相关的操作时,就会出现这个错误:

FIRESTORE (7.17.2) INTERNAL ASSERTION FAILED: Unexpected state
      at fail (/home/cardonapablo/Documentos/Proyectos/Optica (Ilicit)../../../../../node_modules/@firebase/testing/node_modules/@firebase/firestore/src/util/assert.ts:39:9)
      at hardAssert (/home/cardonapablo/Documentos/Proyectos/Optica (Ilicit)../../../../../node_modules/@firebase/testing/node_modules/@firebase/firestore/src/util/assert.ts:53:5)
      at fromBytes (/home/cardonapablo/Documentos/Proyectos/Optica (Ilicit)../../../../../node_modules/@firebase/testing/node_modules/@firebase/firestore/src/remote/serializer.ts:270:5)
      at fromWatchChange (/home/cardonapablo/Documentos/Proyectos/Optica (Ilicit)../../../../../node_modules/@firebase/testing/node_modules/@firebase/firestore/src/remote/serializer.ts:486:25)
      at PersistentListenStream.onMessage (/home/cardonapablo/Documentos/Proyectos/Optica (Ilicit)../../../../../node_modules/@firebase/testing/node_modules/@firebase/firestore/src/remote/persistent_stream.ts:576:25)
      at /home/cardonapablo/Documentos/Proyectos/Optica (Ilicit)../../../../../node_modules/@firebase/testing/node_modules/@firebase/firestore/src/remote/persistent_stream.ts:456:21
      at /home/cardonapablo/Documentos/Proyectos/Optica (Ilicit)../../../../../node_modules/@firebase/testing/node_modules/@firebase/firestore/src/remote/persistent_stream.ts:509:18
      at /home/cardonapablo/Documentos/Proyectos/Optica (Ilicit)../../../../../node_modules/@firebase/testing/node_modules/@firebase/firestore/src/util/async_queue.ts:369:14

我尝试使用开发端点时使用的凭据连接到我的常规firestore数据库,即使是我每天使用的应用程序,仍会出现相同的错误。

奇怪的是,数据正在写入数据库,但错误仍然阻止测试。

这里是firebase设置:

(src/db/functions.js)

let app  = initializeTestApp({ 
    projectId: "illicit"
})
db = app.firestore()
module.exports = { db }

引发错误的函数

(tests/fixtures/db.js)

const { db } = require('../../src/db/functions')
const bcrypt = require('bcrypt');

const createAdmin = async function() {

    // Encrypt password
    let encPass = await bcrypt.hash("admin", 8)

    let admin = {
        name: "Admin Test User",
        email: "admin@test.com",
        password: encPass,
        tokens: []
    }

    // Add to db
    let docRef = await db.collection('admins').add(admin) // <- This line throws the error
    return;
}

module.exports = {
    createAdmin
}

最后进行测试的文件

(tests/glasses.test.js)
const supertest = require('supertest');
const app = require('../src/app')
const functions = require('./fixtures/db')

let adminToken;
let glassesId;

//Executes before any test, here is where error occurs, before any tests
beforeAll( async () => {
    await functions.createAdmin()
    return
})

test('Should log in an admin', async () => {
    let response = await supertest(app)
    .post('/admins/login')
    .send({
        email: 'admin@test.com',
        password: 'admin'
    })
    .expect(200);
    expect(response.body.token).toEqual(expect.any(String))
    adminToken = response.token;
});

只有在测试时才会出现这种情况,普通应用程序运行正常

我尝试过的事情:

  • Firestore规则是读取和写入为true,因此不是规则错误
  • 使用firebase-mock模拟Firestore并使用Jest似乎工作正常,但这不是解决方案,因为我需要测试数据库中的数据

希望你能帮助我 :)

4个回答

34

您应该将Jest的测试环境从默认的jsdom更改为node,可以通过在Jest配置中使用jest --env=node或设置testEnvironment选项为node来完成。


3
谢谢。我在搜索了5分钟后找到了你的评论。你肯定为我节省了数小时甚至数天的时间。从心底感谢你。 - spierce7
1
我通过将以下内容添加到我的jest测试文件中来修复了我的问题: /**
  • @jest-environment node */
- Glenn

5
这是一个在GitHub上的问题。我将我的评论从那个问题中复制到这里,希望能帮助其他人:

我在NextJS 9.6.6上遇到了同样的错误信息。我认为这个错误信息可能是由于一系列错误引起的 - 我在Stackoverflow上看到了100多个关于这个错误信息的问题。

经过大量调试,我意识到我不小心使用了SQL大小写:

.orderBy('time', 'ASC') = "INTERNAL ASSERTION FAILED: Unexpected state" .orderBy('time', 'asc') = No Errors!

这很痛苦,而我的错误是如此之小。也许需要更好的错误报告来处理这种情况?当你得到这个错误信息时,它很容易让你走上完全与真正的错误无关的调试路径。

所以基本上,一个微小的语法错误可能导致错误信息,并让你走上错误的调试路径。要解决这个问题,你必须找到它发生的确切位置并缩小你的调试范围。


我简直不敢相信这个问题被解决了,而且这个问题没有得到更好的处理或至少没有得到更好的报告。 - Zeus

3

我自己解决了这个问题,我原来使用的是Firebase web客户端,后来改用专为服务器设计的Admin SDK,我猜测这可能是一些身份验证问题,因为Admin SDK会自动在数据库中进行身份验证。


0

使用上面指示的内容执行此命令 yarn test jest --env=node,然后错误就会消失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接