程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Express 路由器的模拟后处理程序无法按预期工作大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Express 路由器的模拟后处理程序无法按预期工作?

开发过程中遇到Express 路由器的模拟后处理程序无法按预期工作的问题如何解决?下面主要结合日常开发的经验,给出你关于Express 路由器的模拟后处理程序无法按预期工作的解决方法建议,希望对你解决Express 路由器的模拟后处理程序无法按预期工作有所启发或帮助;

我有一个文档路由器,它有 router.post('/mine',[auth,uploadfile],async (req,res) => { ... }) 路由处理程序。此路由处理程序的实际实现如下。

documents.Js 路由器

const createError = @R_874_10613@ire('./../Helpers/createError');
const auth = @R_874_10613@ire('./../mIDdlewares/auth');
const uploadfile = @R_874_10613@ire('./../mIDdlewares/uploadfile');
const express = @R_874_10613@ire('express');
const router = express.Router();

router.post('/mine',res) => {
    try {
        let user = await User.findByID(req.user._ID);

        let leftdiskSpace = await user.leftdiskSpace();

        if(leftdiskSpace < 0) {
            await accessAndRemovefile(req.file.path);
            res.status(403).send(createError('Your plan\'s disk space is exceeded.',403));
        } else {
            let document = new document({
                filename: req.file.filename,path: `/uploads/${req.user.usernamE}/${req.file.filename}`,size: req.file.size
            });
            document = await document.save();

            user.documents.push(document._ID);
            user = await user.save();

            res.send(document);
        }
    } catch(eX) {
        res.status(500).send(createError(ex.message,500));
    }
});

module.exports = router;

我目前正在使用 jest 和 Supertest 编写集成测试。我当前的 documents.test.Js 测试文件如下:

documents.test.Js 测试文件

const @R_874_10613@est = @R_874_10613@ire('supertest');
const { document } = @R_874_10613@ire('../../../models/document');
const { User } = @R_874_10613@ire('../../../models/user');
const fs = @R_874_10613@ire('fs');
const path = @R_874_10613@ire('path');

let server;

describe('/API/documents',() => {
    beforeEach(() => { server = @R_874_10613@ire('../../../bin/www'); });
    afterEach(async () => {
        let pathToTestFolder = path.join(process.cwd(),config.get('diskStorage.desTination'),'user');
        
        // Remove test uploads folder for next tests
        await fs.promises.access(pathToTestFolder)
            .then(() => fs.promises.rm(pathToTestFolder,{ recursive: true }))
            .catch((err) => { return; });

        // Remove all users and documents written in test database
        await User.deleteMany({});
        await document.deleteMany({});

        server.close();
    });

    describe('POST /mine',() => {
        it('should call user.leftdiskSpace method once',async () => {
            let user = new User({
                username: 'user',password: '1234'
            });
            user = await user.save();

            let token = user.generateAuthToken();

            let file = path.join(process.cwd(),'tests','integration','files','test.Json');

            let documentsRouter = @R_874_10613@ire('../../../routes/documents');

            let errorToThrow = new Error('An error occured...');

            user.leftdiskSpace = jest.fn().mockRejectedValue(errorToThrow);
            
            let mockReq = { user: user };
            let mockRes = {};

            documentsRouter.post = jest.fn();
            documentsRouter.post.mockImplementation((path,callBACk) => {
                if(path === '/mine') {
                    console.warn('called');
                    callBACk(mockReq,mockRes);
                }
            });

            const res = await @R_874_10613@est(server)
                .post('/API/documents/mine')
                .set('x-auth-token',token)
                .attach('document',filE);

            expect(documentsRouter.post).toHaveBeenCalled();
            expect(user.leftdiskSpacE).toHaveBeenCalled();
        });
    });
});

我为 documents.Js 路由器创建了模拟后路由器处理程序。正如您从该路由处理程序的 mockImplementation 中看到的,它检查路径是否等于 '/mine'(这是我的超级测试端点),然后调用 console.warn('called'); 和回调。当我运行此测试文件时,我看不到正文为“已调用”的任何黄色警告消息。而且当 POST 请求端点 /API/documents/mine 时,服务器不会触发我的模拟函数 documentsRouter.post。它从未被调用过。所以我认为服务器的文档路由器没有被我的模拟发布路由处理程序所取代。它仍然使用原始的 post 路由处理程序来响应我的 POST 请求。我应该如何测试我的模拟 documentsRouter.post 函数是否已被调用?

请注意,我的 User 模型有一个自定义方法来检查用户的剩余磁盘空间。我也试图模拟那个猫鼬自定义方法,但它也不起作用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的Express 路由器的模拟后处理程序无法按预期工作全部内容,希望文章能够帮你解决Express 路由器的模拟后处理程序无法按预期工作所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。