【问题标题】:Unit testing mongoose validation with promise resolve/reject带有承诺解决/拒绝的单元测试猫鼬验证
【发布时间】:2018-03-25 00:18:01
【问题描述】:

我正在努力寻找一种方法来对 mongoose 中的字段验证进行单元测试。我目前有以下测试:

it('should be invalid if googleId is empty', () => 
  testBook.googleId = '';
  const newBook = new Book(testBook);
  return newBook.validate().catch((err) => {
    should.exist(err.errors.googleId);
  });
});

此测试未按预期工作,因为如果我对 googleId 进行了正确验证,则测试将通过,因为它将断言 err.errors.googleId 存在,但如果我没有对 googleId 进行任何验证,它也会通过,因为 .catch() 永远不会被调用并且它假定测试通过了。

我尝试将should.fail() 放在.then() 中,但这样它总是以.catch() 结尾,但会出现不同的错误,如果没有验证,它将被should.fail() 错误捕获,如果有验证它将捕获模型验证错误。

实现这种测试的最佳方法是什么?

非常感谢!

编辑: 我尝试使用newBook.validate() 的回调并且它有效,但我从不使用回调模型方法,我总是倾向于使用承诺,所以在这种特殊情况下我应该使用回调还是还有更好的方法来处理它使用承诺?

【问题讨论】:

    标签: node.js unit-testing mongoose mocha.js chai


    【解决方案1】:

    您可以使用第二个参数然后将抛出的东西放在第一个例如:

    return newBook.validate().then(
        resp => throw new Error("Test failed this should not resolve"),
        err =>  should.exist(err.errors.googleId);
    });
    

    所以现在如果newBook.validate() 未被拒绝,测试将失败。由于您没有使用catch(),因此您不会阻止它导致测试失败。如果承诺被拒绝,就像它应该是你的测试通过(假设它满足设置的条件)。这是因为与catch() 不同,then() 的错误回调不会捕获then() 中抛出的错误。当然,您可以在第一个回调中放入任何会引发错误的内容,例如 assert.fail() 或您的库中的任何内容。

    【讨论】:

    • 哦,太好了,我不知道 then() 第二个回调,我现在在第一个回调中返回 should.fail() 并在第二个中做出断言,如你所说一切都很好:D 非常感谢!
    【解决方案2】:

    有一个 chai-as-promised 插件,其中包含帮助程序,使 Promise 测试工作更像普通 chai 期望/应该做的。

    .rejectedWith.rejected 处理错误的方式与普通的 .throw 非常相似。

    const chai = require('chai')
    chai.should()
    chai.use(require('chai-as-promised'))
    
    it('should be invalid if googleId is empty', function(){
      testBook.googleId = ''
      const newBook = new Book(testBook)
      return newBook.validate()
         .should.be.rejectedWith('Validation Failed')
         .and.eventually.have.nested.property('errors.googleId')
    });
    

    如果您正在加载任何其他chai plugins,请确保最后加载插件,否则事情会变得混乱。

    【讨论】:

      猜你喜欢
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2020-10-04
      • 2015-08-31
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      相关资源
      最近更新 更多