Javascript 如何让摩卡通过测试

Javascript 如何让摩卡通过测试,javascript,node.js,mocha.js,Javascript,Node.js,Mocha.js,我有以下测试: it.only('validation should fail', function(done) { var body = { title: "dffdasfsdfsdafddfsadsa", description: "Postman Description", beginDate: now.add(3, 'd').format(), endDate: now.add(4, 'd').format()

我有以下测试:

it.only('validation should fail', function(done) {
    var body = {
        title: "dffdasfsdfsdafddfsadsa",
        description: "Postman Description",
        beginDate: now.add(3, 'd').format(),
        endDate: now.add(4, 'd').format()
    }


    var rules = eventsValidation.eventCreationRules();
    var valMessages = eventsValidation.eventCreationMessages();

    indicative
        .validateAll(rules, body, valMessages)
        .then(function(data) {
            console.log("SHOULD NOT GET HERE");
            should.fail("should not get here");
            done();

        })
        .catch(function(error) {
            console.log("SHOULD GET HERE");
            console.log(error);
        });
    done();
});
测试执行路径是正确的。当我有验证数据时,它会转到“不应该到这里”。测试的目的是确保它不会。当我输入非验证性数据时,代码会转到“应该到这里”。因此验证规则是有效的

我试图做的是确保当我有错误的验证数据时测试失败,并且它验证了。然而,当我使用良好的数据按原样运行时,它会验证、运行失败,但摩卡仍将其标记为通过。如果执行到“不应该到这里”,我希望它失败

我尝试抛出新错误(“失败”);也没有运气。在这两种情况下,它实际上似乎也在.catch块中运行代码

有什么建议吗?
我找到了一个解决办法。写这个问题是因为这些解决方案似乎对我不起作用。

使用
chai作为承诺
,使用本地摩卡承诺处理程序

var chai=require('chai')。使用(require('chai-as-associated'));
var should=chai.should();//这将为承诺断言启用.should
您不再需要
完成
,只需返回承诺即可

//从下面的行中删除'done'
仅限('validation should fail',函数(/*done*/){
变量体={
标题:“DFFDASFSDFSDFDFSADSA”,
描述:“邮递员描述”,
beginDate:now.add(3,'d').format(),
endDate:now.add(4,'d').format()
}
var rules=eventsValidation.eventCreationRules();
var valMessages=eventsValidation.eventCreationMessages();
//还债
指示性回报
.validateAll(规则、正文、消息)
.should.be.rejected;//只有承诺被拒绝,测试才会通过
//移除完成后,我们不再需要它
//完成();
});
您可以拨打:

此外,如果使用参数调用
done()
函数,Mocha认为测试失败

例如:

it("should return empty set of tags", function(done)
{
    done(new Error("Some error message here"));
});
虽然第一个对我来说更清楚。

在ES2017/world
中,不需要像承诺的那样
。虽然简单的拒绝是一个地方,
chai承诺的
仍然有点整洁

如果要更详细地测试错误,则需要一个
catch

it.only('validation should fail', async function(){
    let body = { ... }
    let rules = eventsValidation.eventCreationRules()
    let valMessages = eventsValidation.eventCreationMessages()

    try {
        await indicative.validateAll(rules, body, valMessages)
    } catch (error) {
        expect(error).to.be.instanceOf(Error)
        expect(error.message).to.match(/Oh no!/)
        return
    }
    expect.fail(null, null, 'validateAll did not reject with an error')
    // or throw new Error('validateAll did not reject with an error')
})

/需要一个类似于

的编译器,这个简单的抛出对我来说很有用

describe('Lead', () => {
  it('should create a new lead', async () => {
     throw 'not implemented'
  })
})

仅在'then'函数中调用done回调的可能重复删除外部done函数,因为当它到达catch函数时,将没有done回调,因此它将自动显示超时错误,因为您只是在安慰outer,done通过了所有测试,所以绝对没有理由通过这样做而不是使用接受的答案来解决OP的问题。@Louis您是在说接受的答案吗建议将chai添加为另一个依赖项的答案?限制依赖似乎是一个合理的理由。@ken OP使用承诺。因此,解决方案应该利用摩卡理解承诺这一事实。这些天提出的问题中有一半是由于坚持使用
done
而导致的问题,而这一切都可以通过使用测试代码已经生成的承诺来简化。因为,请看,虽然可以使用带有承诺的
done
,但它附带了一些重要的问题,这里的答案忽略了这些问题。至于依赖关系,一旦你超越了玩具代码,像承诺的那样依赖
chai也不是什么大问题。@Louis你能扩展gotchas吗?@DanielKobe我已经改进了我的答案,因为我知道了导致测试失败的其他方法。
describe('Lead', () => {
  it('should create a new lead', async () => {
     throw 'not implemented'
  })
})