Sequelize w/Postgres 测试异步错误

Posted

技术标签:

【中文标题】Sequelize w/Postgres 测试异步错误【英文标题】:Sequelize w/Postgres testing async errors 【发布时间】:2018-04-02 18:55:59 【问题描述】:

我一直在使用 Postgres 数据库为 Sequelize 编写单元测试。对于测试,我目前正在使用 Jest。现在,我可以让这段代码工作了:

test('email field only takes valid emails', () => 
  expect.assertions(2);
  let user = Users.build( email: 'notAProperEmail', password: 'abc123' );
  return user.validate().catch(err => 
    expect(err).toHaveProperty('errors');
    expect(err.errors[0].message).toEqual('Validation isEmail on email failed');
  );
)

但由于某种原因,这会引发错误“SequelizeDatabaseError:关系“用户”不存在”。此外,expect 方法也永远不会被命中,因为我得到了预期的断言错误:“预期要调用一个断言,但接收到零个断言调用。”

describe('Password is encrypted', () => 
beforeAll(() => 
  Users.create(
    email: 'test1@gmail.com',
    password: 'testPassword123'
  )
);

test('password is not plain text', () => 
  expect.assertions(1);
  return Users.findOne(where:  email: 'test1@gmail.com' ).then(response => 
    expect(2).toEqual(2)
    console.log('console log here: ', response);
  );
);

我唯一的猜测是,因为 build 实际上并没有保存到数据库中,所以它会及时返回一个值,以便 Jest 做出断言。所以我的直觉是使用 Promise 来处理异步性质(另外,我检查了 Jest 文档)。但它仍然会引发此错误,并且似乎在 Sequelize 完成从我的 Postgres 数据库中获取数据之前返回了承诺。如果有人能阐明我遇到的这个问题,我将不胜感激!

【问题讨论】:

【参考方案1】:

有点晚了,但我在这里登陆后刚刚解决了一些非常相似的问题!这可能是环境问题。当您运行您的测试套件时,开玩笑将寻找与您的test 环境相关的数据库,而不是您的dev 环境。 在我的情况下,我使用的是 postgres 和 knex,不同的 env 配置在 knexFile 中。我想续集是相似的! 寻找它的方法是运行psql myDBinWhateverEnv 并查看您是否有关系“用户”

【讨论】:

以上是关于Sequelize w/Postgres 测试异步错误的主要内容,如果未能解决你的问题,请参考以下文章

在nodejs sequelize中循环获取异步数据

Node + Sequelize:如何在添加之前检查项目是不是存在? (异步混淆)

等待总是抛出 SyntaxError:等待仅在 sequelize 的异步函数中有效 [重复]

sequelize getter 方法中的异步表查询

Node.js / Sequelize.js / Express.js - 如何插入多对多关联? (同步/异步?)

Sequelize 不返回 queryAsync 对象