我有一个快速应用程序(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,而不会会对该数据库进行调用,但会返回假数据(就像它已经)。
答案 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);
});