我使用Expect和supertest对Mocha进行了测试,效果很好。但是我不明白它是如何工作的。我正在使用express作为服务器,以及mongodb和mongoose。
我知道对.get()的测试将如何工作,这是很合理的。 Youtube教程和Mocha文档无法为我提供任何真正的见识。
describe('DELETE for a specific todo', ()=>{
it('should delete a todo', (done)=>{
let id0 = todos[0]._id
request(app)
.delete(`/todos/${id0}`)
.expect(200)
.expect((response)=>{
expect(response.body.todo._id).toBe(id0)
});
.end((err, res)=>{
if(err){
return done(err)
}
Todo.findById(id0).then((todo)=>{
expect(todo).toNotExist();
}).catch((err)=>done(err))
})
});
it('should fail to find ID in db', (done)=>{
request(app)
.delete(`/todos/${new ObjectID()}`)
.expect(500)
.end(done)
});
it('should fail due to invalid ID', (done)=>{
request(app)
.delete('/todos/999')
.expect(404)
.end(done)
});
});
只需找到此代码,模型/集合就可以了,但是mocha如何测试.delete而不实际从数据库中删除内容?它会创建一个模拟数据库,然后在其上运行上述测试吗?它会删除某些内容,运行测试然后取消删除吗?我只是不明白当我使用request(app).delete()时,mocha / supertest在做什么,我的意思是,它必须修改我的模型指定的集合,否则Todo(这是该模型)是否不可能名称)以正常工作。...
答案 0 :(得分:0)
您的问题不是真正关于Mocha,而是更具体地关于Supertest的工作方式。
Supertest提供了自己的expect
方法,当您通过Supertest链接该方法时会调用该方法。 Supertest本身是Superagent
的包装器,提供了各种请求方法。在这种情况下,Superagent的.delete
方法将立即向您的快递服务器调用HTTP DELETE请求,除非您在Express服务器的设置中进行某种形式的模拟,否则它将执行Express的任何操作。服务器具有该路由。
TL; DR:Supertest不执行任何模拟,您的代码应在与Supertest连接到的Express服务器中执行任何模拟设置。否则,它将删除数据或执行Express服务器设置为在特定路由上执行的任何其他逻辑。