测试期间如何模拟/拦截对mongoDB地图集的调用? (云数据库)

时间:2019-06-25 20:25:44

标签: node.js mocha supertest mongodb-atlas

我有一个快速应用程序(REST API),可在测试期间连接到MongoDB Atlas(云数据库)上的mongoDB集群。我正在使用摩卡咖啡进行测试。

我有一个端到端测试(使用数据库),但是对于大多数测试,我想模拟/存根对数据库的调用,以便隔离数据库。

我曾尝试使用nock截取网络连接并模拟响应,但是从我的看到,nock仅用于http呼叫,而mongoDB Atlas使用DNS(以mongodb+srv:开头,请参见here以获得更多信息),我认为这就是为什么我无法使其正常工作的原因。

我也试图将模型存根。我正在努力使其正常工作,但似乎可以选择吗?

// The route 
router.post('/test', async (req, res) => {
  const { name } = req.body;

  const example = new ExampleModel({ name: name})

  // this should be mocked
  await example.save();

  res.status(200);
});

// The test
describe('POST /example', () => {
  it('Creates an example', async () => {
    // using supertest to make http call to my API app 
    const response = await request(app)
      .post('/test')
      .type("json")
      .send({ 'name': 'test-name' })

    // expect the model to have been created and then saved to the database
  });
});

我希望在运行测试时,它将对API进行POST,而不会会对该数据库进行调用,但会返回假数据(就像它已经)。

1 个答案:

答案 0 :(得分:0)

我发现了一些非常有用的资源并进行共享:

  • 隔离猫鼬单元测试(包括诸如findOne guide之类的模型方法
  • 在模型上插入save方法:Stubbing the mongoose save method on a model(我刚用过`sinon.stub(ExampleModel.prototype,'save')。

    //示例代码 it('返回400状态代码',async()=> {       sinon.stub(ExampleModel,'findOne')。returns({name:'testName'});       const saveStub = sinon.stub(ExampleModel.prototype,'save');

      const example = new ExampleModel({ name: 'testName' })
    
      const response = await request(app)
        .post('/api/test')
        .type("json")
        .send({ name: 'testName' })
    
    sinon.assert.calledWith(Hairdresser.findOne, {
          name: 'testName'
      });
    
      sinon.assert.notCalled(saveStub)
    
      assert.equal(response.res.statusCode, 400);
    });