如何在Nodejs中使用sinon存根测试随机重定向URL



在控制器中,我正在重定向到另一个以查询参数为状态的url。状态只是随机UUID。就像控制器下面给出的一样。

测试控制器.ts

import {Request,Response} from "express";
import {v4 as uuid} from "uuid";
export function test(req:Request,res:Response){
const state=uuid();
console.log(state) // 110ec58a-a0f2-4ac4-8393-c866d813b8d1
if(true){
const url=`https://testurl/user?state=${state}`;
res.redirect(302,url);
}
}

以及类似下面的单元测试文件

测试控制器规范

import {Request,Response} from "express";
import * as sinon from 'sinon';
import {expect} from 'chai';
import * as proxyquire from 'proxyquire';
descripbe('shoud redirect',()=>{
const validurl:string="https://testurl/user?state=110ec58a-a0f2-4ac4-8393-c866d813b8d1";
let res:any;
let req:any
let resstub:{calledWith:any};
beforeEach(()=>{
res={
redirect:()=>{}
}
resstub = sinon.stub(res,'redirect');
});
it('should redirect with valid url',()=>{
const urlctl=proxyquire('test-contriller',{});
urlctl.test(req,res);
expect(resstub.calledWith(302,validurl)).to.be.true;
})
})

当我验证重定向URL部分时,它失败了,因为状态值每次都是随机链接的。请帮助我如何验证

从文档如何使用CommonJS的链接接缝。我们将使用proxyquire来构造我们的接缝,这样我们就可以截断从uuid包导出的v4函数。

controller.ts:

import { Request, Response } from 'express';
import { v4 as uuid } from 'uuid';
export function test(req: Request, res: Response) {
const state = uuid();
if (true) {
const url = `https://testurl/user?state=${state}`;
res.redirect(302, url);
}
}

controller.test.ts:

import sinon from 'sinon';
import proxyquire from 'proxyquire';
describe('shoud redirect', () => {
let res: any;
let req: any;
beforeEach(() => {
res = { redirect: sinon.stub() };
});
it('should redirect with valid url', () => {
const uuidv4Stub = sinon.stub().returns('110ec58a-a0f2-4ac4-8393-c866d813b8d1');
const urlctl = proxyquire('./controller', {
uuid: { v4: uuidv4Stub },
});
urlctl.test(req, res);
sinon.assert.calledWithExactly(
res.redirect,
302,
'https://testurl/user?state=110ec58a-a0f2-4ac4-8393-c866d813b8d1',
);
});
});

测试结果:

shoud redirect
✓ should redirect with valid url (1592ms)

1 passing (2s)
---------------|---------|----------|---------|---------|-------------------
File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------|---------|----------|---------|---------|-------------------
All files      |     100 |       50 |     100 |     100 |                   
controller.ts |     100 |       50 |     100 |     100 | 6                 
---------------|---------|----------|---------|---------|-------------------

最新更新