我有一个LandingScreen
组件,其中包含一个onPositivePermission
函数。在此函数中,我从FacebookConnector
调用了静态登录方法。我想测试登录方法确实在onPositivePermission
中被调用。我尝试了不同的测试,但是没有一个起作用。我的组件如下:
LandingScreen
class LandingScreen extends Component {
constructor(props) {
super(props);
this.loginMethods = {
fbLogin: 0,
emailLogin: 1,
}
}
onPositivePermission = loginMethod => {
if (loginMethod === this.loginMethods.fbLogin)
{ FacebookConnector.login();
}
};
FacebookConnector
export default class FacebookConnector {
static login = async() => {
try { const result = await LoginManager.logInWithPermissions([ 'public_profile', 'email', ]);
if (result.isCancelled) {
//do nothing, the user cancelled
} else {
//handle Facebook login }
} catch (error) {
//handle error
}
};
这是我的考验:
it('Calls the Facebook login method', () => {
const fbLogin = 0;
const landingScreen = renderer.create(<LandingScreen />).getInstance();
let loginMock = jest.fn();
jest.mock('../../connectors/Facebook/FacebookConnector', () => ({
default: class {
static login() {
mock.loginMock;
}
},
}));
landingScreen.onPositivePermission(fbLogin);
expect(loginMock).toHaveBeenCalled();
});
我还尝试如下模拟FacebookConnector:
jest.mock('../../connectors/Facebook/FacebookConnector', () => ({
login: mock.loginMock,
}));
但是,在两种情况下,我都会得到:
expect(jest.fn()).toHaveBeenCalled()
Expected number of calls: >= 1
Received number of calls: 0
我已经在onPositivePermission()
函数中添加了日志,并发现确实由测试调用了该日志,但是Expect语句仍然失败。
我还尝试过删除onPositivePermission();
中的if语句,期望仍然失败。
请注意,我手动测试了功能并调用了FacebookConnector.login()
,但我也想对其进行单元测试。
有人知道为什么单元测试不起作用吗?
答案 0 :(得分:1)
login
是FacebookConnector
类中的静态方法,因此您可以通过以下方式对其进行模拟。
it('Calls the Facebook login method', () => {
const fbLogin = 0;
const landingScreen = renderer.create(<LandingScreen />).getInstance();
const loginMock = jest.fn();
loginMock.mockReturnValue('some value');
FacebookConnector.login = loginMock;
landingScreen.onPositivePermission(fbLogin);
expect(loginMock).toHaveBeenCalled();
});
P.S。您无需添加返回值,没有该返回值就可以使用。
让我们更清楚一点:
expect(jest.fn()).toHaveBeenCalled()
不起作用,因为尚未实际调用jest.fn()。您仅创建一个jest.fn实例并期望它被调用。
但是如果您将其分配给变量,然后调用该函数
const someFunction = jest.fn(); //creating a jest.fn instance
someFunction(); //we are calling the function here.
expect(someFunction).toHaveBeenCalled() // it will pass
它将正常工作。