【问题标题】:How to "undo changes" on a mongoose document?如何在猫鼬文档上“撤消更改”?
【发布时间】:2015-06-18 18:09:44
【问题描述】:

出于测试目的,我需要撤消加载 mongoose 的文档中的更改。

即。我尝试将某些内容设置为错误的类型,当然,失败了。然后我尝试别的东西,但我在第一个错误上失败了。示例:

// here I load the user
before(function(done) {
  user = loadUserSomehow();
  done();
})
it ('should validate email', function(done) {

    // now I try one field wrong
    user.email = 'This is not a valid email';
    user.save(function(err) {
        err.message.should.equal.'Invalid email'; // to simplify
        // I would get 'invalid email' error here.
    });
});
it ('should validate type', function(done) {

    // now I try another field wrong
    user.type = 'This type does not exist';
    user.save(function(err) {
        err.message.should.equal.'Invalid user type'; // THIS fails
        // instead of invalid type, I still get an invalid email message
    });
});

为了避免在每次测试之前重新加载文档,我如何“撤消”对 mongoose 文档的更改?

【问题讨论】:

  • 附带说明,您没有在测试中调用 done()
  • 您找到了更好的解决方案,如果您能回答自己的问题,这样其他人可以从您的研究中受益,那就太好了。谢谢
  • 我想我使用了一些模拟数据库设置。那是很久以前的事了,所以我真的不记得了。

标签: node.js testing mongoose mocha.js


【解决方案1】:

Mongoose 不支持“撤消”该操作。但是,您可以有多种选择:

  1. 手动处理撤消操作。如果您按顺序运行所有测试,您可以编辑您的测试,使它们看起来像:

    it ('should validate email', function(done) {
        var oldValue = user.email;
        user.email = 'This is not a valid email';
        user.save(function(err) {
            err.message.should.equal.'Invalid email';
            user.email = oldValue;
            done(null);
        });
    });
    

    请注意,这不是正确的“撤消”,因为 Mongoose 仍会将 user.email 视为已修改(如果您运行 user.isModified('email'),您应该得到一个真实的值)。

  2. 在每次测试前重新加载user。由于这不是一个生产环境,而只是一个测试用例,所以这里的优化应该不是太重要。只需将 before 方法的名称更改为 beforeEach

【讨论】:

    【解决方案2】:

    您可以将创建的文档指向一些 vars (const) 并在测试后为每个 var 运行 deleteMany

    const someDocument = undefined;
    
    // it should ... your testing code
    // point "new Document()" to someDocument
    
    afterEach(async () => {
        Document.deleteMany({_id: someDocument._id});
    })
    
    

    您还可以连接到不同的数据库进行测试并在完成时将所有内容发送到转储

    【讨论】:

    • 嗨!这是一个有 5 年历史的问题,我早就继续前进并找到了更好的解决方案,但感谢您的回答和贡献,它可能会给其他人在谷歌上搜索这个问题/答案提供一个想法。
    • 您找到了更好的解决方案,如果您能回答自己的问题,这样其他人可以从您的研究中受益,那就太好了。谢谢
    猜你喜欢
    • 2018-03-17
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多