request(app).del()/.delete() 如何为 Mocha/Supertest 工作?
How does request(app).del()/.delete() work for Mocha/Supertest?
我使用 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)
});
});
这段代码只是找到,model/collection 完全没问题,但是 mocha 如何测试 .delete 而没有从我的数据库中实际删除一些东西?它是否创建了一个模拟数据库,然后 运行 表示对其进行测试?它会删除一些东西,运行 测试,然后取消删除吗?我只是不明白 mocha/supertest 在我使用 request(app).delete() 时在做什么。我的意思是,它必须修改我的模型指定的集合,否则如果 Todo 是不可能的(这是型号名称)才能正常工作....
您的问题并不是关于 Mocha,而是关于 Supertest 的工作原理。
超测提供了自己的expect
method which is what gets invoked when you chain it through Supertest. Supertest is itself a wrapper for Superagent
,提供了各种请求方式。在这种情况下,Superagent 的 .delete
方法将直接向您的 Express 服务器调用 HTTP DELETE 请求,除非您在 Express 服务器的设置中进行某种形式的模拟,否则它将执行您的 Express 的任何操作服务器有那条路线。
TL;DR:Supertest 不执行任何模拟,您的代码应该在您将 Supertest 连接到的 Express 服务器中执行任何模拟设置。否则,它将删除数据或执行您的 Express 服务器设置为在特定路由上执行的任何其他逻辑。
我使用 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)
});
});
这段代码只是找到,model/collection 完全没问题,但是 mocha 如何测试 .delete 而没有从我的数据库中实际删除一些东西?它是否创建了一个模拟数据库,然后 运行 表示对其进行测试?它会删除一些东西,运行 测试,然后取消删除吗?我只是不明白 mocha/supertest 在我使用 request(app).delete() 时在做什么。我的意思是,它必须修改我的模型指定的集合,否则如果 Todo 是不可能的(这是型号名称)才能正常工作....
您的问题并不是关于 Mocha,而是关于 Supertest 的工作原理。
超测提供了自己的expect
method which is what gets invoked when you chain it through Supertest. Supertest is itself a wrapper for Superagent
,提供了各种请求方式。在这种情况下,Superagent 的 .delete
方法将直接向您的 Express 服务器调用 HTTP DELETE 请求,除非您在 Express 服务器的设置中进行某种形式的模拟,否则它将执行您的 Express 的任何操作服务器有那条路线。
TL;DR:Supertest 不执行任何模拟,您的代码应该在您将 Supertest 连接到的 Express 服务器中执行任何模拟设置。否则,它将删除数据或执行您的 Express 服务器设置为在特定路由上执行的任何其他逻辑。