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 服务器设置为在特定路由上执行的任何其他逻辑。