gpt4 book ai didi

unit-testing - 如何对调用 res.cookie 的 express 中间件函数进行单元测试

转载 作者:行者123 更新时间:2023-12-04 04:05:41 26 4
gpt4 key购买 nike

我正在尝试使用 mocha、chai 和 sinon 对我自己的快速中间件功能进行单元测试。

基本上这个函数检查 token req.query 上的参数,如果存在,则添加一个值为 token 的 cookie .

function tokenRedirect(req, res, next) {
const qs = require('querystring');

if (req.query && req.query.token) {
res.cookie('token', req.query.token);
} else {
next();
return;
}

res.redirect('/');
}

我知道我可以这样做:
res = { cookie: sinon.spy() };

进而
assert(res.cookie.calledWith('token', expectedToken));

但我想做的是检查 req.cookies实际上有我期望的 cookie,如下所示:
assert.equal(req.cookies.token, expectedToken);

问题是 res , req ,并且它们的所有属性都只是我为测试创建的模拟,因此 res.cookie不是真正将cookies添加到 req的实际express函数目的。

怎样才能过真正的快车 res反对我的功能?甚至有可能吗?

我希望我足够清楚,单元测试对我来说是一个新概念。

最佳答案

使用实际reqres来自 Express 的对象会更多地接受集成测试(如果我错了,请纠正我)。单元测试仅关注您的代码,并且应该模拟所有其他外部依赖项,如果我在评论中错了,请再次纠正我。

而不是 mock ression ,您需要部分模拟/实现 Express 使用的逻辑 here .所以像(使用 Jest):

const tokenRedirect = require('../location/to/middleware/tokenRedirect')

describe('tokenRedirect', () => {
/**
* Mocked Express Request object.
*/
let req

/**
* Mocked Express Response object.
*/
let res

/**
* Mocked Express Next function.
*/
let next = jest.fn()

beforeEach(() => {
req = {
body: {}
}

res = {
query: {},
headers: {},
data: null,
json(payload) {
this.data = JSON.stringify(payload)
},
cookie(name, value, options) {
this.headers[name] = value
}
}

next.mockReset()
})

test('should correctly set cookie', async () => {
const expectedToken = 'expected'
res.query.token = ''

tokenRedirect(req, res, next)

expect(res.headers.token).toBeDefined()
expect(res.headers.token).toEqual(expectedToken)
})
})

关于unit-testing - 如何对调用 res.cookie 的 express 中间件函数进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48888413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com