我最近学习如何使用mocha和supertest编写测试。 当我尝试测试帖子网址时,它需要_csrf属性,所以我检查一下 [如何用CSRF测试快递表格?
] 1
并输入以下代码
var request = require('supertest');
var should = require('should');
var app = require('../app');
var $ = require('jquery')(require("jsdom").jsdom().parentWindow);
describe('User', function () {
it('should create a admin', function (done) {
request(app)
.get('/rear')
.expect(200)
.end(function (err, res) {
if (err) return done(err);
should.not.exist(err);
var $html = $(res.text);
var csrf = $html.find('input[name=_csrf]').val();
console.log(csrf);
should.exist(csrf);
request(app)
.post('/user/signup')
.send({
_csrf: csrf,
name: 'admin',
mobile: '12345678901',
password: '123456',
repassword: '123456',
gender: '0'
})
.expect(302)
.end(function (err, res) {
if (err) return done(err);
should.not.exist(err);
res.header.location.should.include('/rear');
done();
});
});
});
});
终端通知说 错误:CSRF令牌不匹配 错误:预期302“发现”,得到403“禁止”
我的代码模仿用户行为,在/后路由器渲染的页面上获取csrf然后将其发布到/ user / signup,我不知道哪里出错了以及如何修复它。如果您发现原因,请提醒我,非常感谢。
答案 0 :(得分:0)
var agent = request.agent(app);
describe('User', function () {
it('should create a admin', function (done) {
agent
.get('/rear')
.expect(200)
.end(function (err, res) {
if (err) return done(err);
should.not.exist(err);
var $html = $(res.text);
var csrf = $html.find('input[name=_csrf]').val();
console.log(csrf);
should.exist(csrf);
request(app)
.post('/user/signup')
.send({
_csrf: csrf,
name: 'admin',
mobile: '12345678901',
password: '123456',
repassword: '123456',
gender: '0'
})
.expect(302)
.end(function (err, res) {
if (err) return done(err);
should.not.exist(err);
res.header.location.should.include('/rear');
done();
});
});
});
});