我正在学习如何在不连接任何API的情况下测试前端Web应用程序。 我的问题是:我必须测试一个POST HTTP请求,但总是收到一个错误:TypeError:loginUser(...)。然后这不是一个函数。
我知道我的期望是不正确的。我必须更改JWT令牌的数据,并且还不知道现在该怎么做。
这是一个简单的用户身份验证。发送电子邮件和密码的Http帖子,取回JWT(json网络令牌)。我必须编写测试以确保已发送正确的信息并获得JWT作为响应。
感谢您的帮助
这是我的代码:
//login.test.js
const expect = require('chai').expect;
const loginUser = require('../src/actions/authActions').loginUser;
const res = require('./response/loginResponse');
const nock = require('nock');
const userData = {
email: 'test@test.com',
password: '123456'
};
describe('Post loginUser', () => {
beforeEach(() => {
nock('http://localhost:3000')
.post('/api/users/login', userData )
.reply(200, res);
});
it('Post email/pwd to get a token', () => {
return loginUser(userData)
.then(res => {
//expect an object back
expect(typeof res).to.equal('object');
//Test result of name, company and location for the response
expect(res.email).to.equal('test@test.com')
expect(res.name).to.equal('Tralala!!!')
});
});
});
//authActions.js
import axios from "axios";
import setAuthToken from "../utils/setAuthToken";
import jwt_decode from "jwt-decode";
import {
GET_ERRORS,
SET_CURRENT_USER,
USER_LOADING
} from "./types";
// Login - get user token
export const loginUser = userData => dispatch => {
axios
.post("/api/users/login", userData)
.then(res => {
// Save to localStorage
// Set token to localStorage
const { token } = res.data;
localStorage.setItem("jwtToken", token);
// Set token to Auth header
setAuthToken(token);
// Decode token to get user data
const decoded = jwt_decode(token);
// Set current user
dispatch(setCurrentUser(decoded));
})
.catch(err =>
dispatch({
type: GET_ERRORS,
payload: err.response.data
})
);
// loginResponse.js
module.exports = { email: 'test@test.com',
password: '123456',
name: "Tralala!!!"
};
实际结果: 1)发布loginUser 发布电子邮件/密码以获取令牌: TypeError:loginUser(...)。then不是一个函数 在Context.then(test / login.test.js:37:12)
答案 0 :(得分:0)
您调用loginUser
方法的方式不正确。此方法返回另一个函数。因此,除了loginUser(userData)
,还必须指定dispatch
参数,例如loginUser(userData)(dispatch).then()
。
我更改了在return
语句之前指定axios
的方法
export const loginUser = userData => dispatch => {
return axios // adding return
.post("/api/users/login", userData)
.then(res => {
...
})
.catch(err =>
dispatch({
type: GET_ERRORS,
payload: err.response.data
})
);
};
为了测试,我可能会牵涉Sinon来监视dispatch
it("Post email/pwd to get a token", () => {
const dispatchSpy = sinon.spy();
return loginUser(userData)(dispatchSpy).then(res => {
//expect an object back
expect(typeof res).to.equal("object");
//Test result of name, company and location for the response
expect(res.email).to.equal("test@test.com");
expect(res.name).to.equal("Tralala!!!");
});
});
希望有帮助