我目前有一个用于与我的API api.js
进行交互的对象:
export var Auth = (function () {
var Login = async function(username, password) {
//Async login code for interacting with the API
};
return {
Login: Login
}
});
此对象已导入另一个文件login.js
中:
import * as API from './api';
export var LoginRequestHandler = function() {
//processess user input, then calls:
try {
await API.Auth().Login(username, password);
} catch(e) {
throw new Error(e);
}
这是我开玩笑的测试:
import * as API from '../api';
import * as User from '../user';
jest.mock('../api');
const spy = jest.spyOn(API.Auth(), 'Login');
User.LoginRequestHandler().then(() => {
expect(spy).toHaveBeenLastCalledWith('theUsername', 'thePassword');
}).catch(error => console.log(error));
这是我的模拟文件__mock__/api.js
:
export var Auth = (function () {
var Login = async function(username, password) {
return Promise.resolve(true);
};
return {
Login: Login
}
});
我通过theUsername
中的thePassword
检索了document.getElementId()
和LoginRequestHandler
,并为上述测试创建了自己的DOM。
在console.log(username)
中添加LoginRequestHandler
揭示了它正在被调用并能够获得正确的值。此外,在console.log(username)
中添加API.Auth().Login
也表明它也在获取正确的值。但是,当我查看测试日志时,发现:Number of calls: 0
用于模拟功能,并且测试会导致错误。
我假设我试图监视错误的功能,并且无论如何我都可以解决此问题?
答案 0 :(得分:0)
每次调用API.Auth()
时,它将返回一个具有Login
方法的新对象。因此,在测试用例中,在LoginRequestHandler
函数中创建的对象和通过jest.spyOn(API.Auth(), 'Login')
语句创建的对象是不同的。间谍只会添加到后面的间谍中。 Login
函数中的LoginRequestHandler
方法没有被监视。
因此,在这里,我将使用jest.mock()
模拟api.js
模块,而不将模拟对象放入__mocks__
目录。例如
api.js
:
export var Auth = function () {
var Login = async function (username, password) {};
return {
Login: Login,
};
};
user.js
:
import * as API from './api';
export var LoginRequestHandler = async function () {
const username = 'theUsername';
const password = 'thePassword';
try {
await API.Auth().Login(username, password);
} catch (e) {
throw new Error(e);
}
};
user.test.js
:
import * as API from './api';
import * as User from './user';
jest.mock('./api', () => {
const auth = { Login: jest.fn() };
return {
Auth: jest.fn(() => auth),
};
});
describe('61643983', () => {
afterEach(() => {
jest.clearAllMocks();
});
it('should login', () => {
expect.assertions(2);
return User.LoginRequestHandler().then(() => {
expect(API.Auth).toBeCalledTimes(1);
expect(API.Auth().Login).toHaveBeenLastCalledWith('theUsername', 'thePassword');
});
});
it('should throw error', () => {
expect.assertions(4);
const mError = new Error('user not found');
API.Auth().Login.mockRejectedValueOnce(mError);
return User.LoginRequestHandler().catch((e) => {
expect(API.Auth).toBeCalled();
expect(API.Auth().Login).toHaveBeenLastCalledWith('theUsername', 'thePassword');
expect(e).toBeInstanceOf(Error);
expect(e.message).toMatch(/user not found/);
});
});
});
具有100%覆盖率的单元测试结果:
PASS stackoverflow/61643983/user.test.js (11.507s)
61643983
✓ should login (5ms)
✓ should throw error (3ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
user.js | 100 | 100 | 100 | 100 |
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 13.023s
源代码:https://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/61643983