如何在mongoose文档上“撤消更改”?

时间:2015-04-13 12:22:38

标签: node.js testing mongoose mocha

我需要撤消加载mongoose的文档中的更改以进行测试。

IE中。我尝试设置错误的类型,当然,失败。然后我尝试别的东西,但我在第一次错误时失败了。例如:

// 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文件上?

2 个答案:

答案 0 :(得分:0)

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

  3. 即可

答案 1 :(得分:0)

您可以将创建的文档指向一些变量(const),然后在测试后为每个变量运行deleteMany

const someDocument = undefined;

// it should ... your testing code
// point "new Document()" to someDocument

afterEach(async () => {
    Document.deleteMany({_id: someDocument._id});
})


您还可以连接到其他数据库进行测试,并在完成后将所有内容发送至转储