Mocha / Supertest的request(app).del()/。delete()如何工作?

时间:2018-12-23 05:51:01

标签: javascript node.js 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)
  });
});

只需找到此代码,模型/集合就可以了,但是mocha如何测试.delete而不实际从数据库中删除内容?它会创建一个模拟数据库,然后在其上运行上述测试吗?它会删除某些内容,运行测试然后取消删除吗?我只是不明白当我使用request(app).delete()时,mocha / supertest在做什么,我的意思是,它必须修改我的模型指定的集合,否则Todo(这是该模型)是否不可能名称)以正常工作。...

1 个答案:

答案 0 :(得分:0)

您的问题不是真正关于Mocha,而是更具体地关于Supertest的工作方式。

Supertest提供了自己的expect方法,当您通过Supertest链接该方法时会调用该方法。 Supertest本身是Superagent的包装器,提供了各种请求方法。在这种情况下,Superagent的.delete方法将立即向您的快递服务器调用HTTP DELETE请求,除非您在Express服务器的设置中进行某种形式的模拟,否则它将执行Express的任何操作。服务器具有该路由。

TL; DR:Supertest不执行任何模拟,您的代码应在与Supertest连接到的Express服务器中执行任何模拟设置。否则,它将删除数据或执行Express服务器设置为在特定路由上执行的任何其他逻辑。