【发布时间】:2018-02-25 15:56:32
【问题描述】:
我正在使用 Enzyme 和 Jest 测试 React Native 组件。我已经能够测试是否调用了模拟函数(在这种情况下为 Alert.alert),如下所示:
Alert.alert = jest.fn();
someButton.simulate('Press');
expect(Alert.alert.mock.calls.length).toBe(1);
这种方法效果很好。
无论如何,我有一个登录按钮,它启动一个提取。我的 fetch 函数是这样的:
fetch(ipAddress, {
...
})
.then(response => response.json())
.then((responseJson) => {
if (responseJson.login === 'success') {
Alert.alert('Login', 'Logged in succesfully!');
console.log('i'm here');
我用 promise 模拟了一个 fetch。我将控制台打印添加到我的 fetch 函数中,并注意到它们打印在测试用例中,就像我预期的那样。这意味着 'i'm here' 在测试运行时打印出来。
无论如何,当我在测试用例中模拟登录按钮按下时,Alert.alert.mock.calls.length 为零。我在这里做错了什么?
【问题讨论】:
-
您是否在问如何测试返回承诺的 fetch 调用?还是您在问为什么您的测试返回 0 而不是 1?
-
@wuno 我在问为什么在异步函数中调用模拟函数的调用计数不会更新
-
我怀疑它不是 1 的原因是因为它还没有完成。所以它仍然是 0,因为那时它还没有返回任何东西。您似乎没有将其视为承诺。因此,当您在解释处理 Promise 的部分中查看此页面时,请在处理回调的代码部分中使用您的期望。所以使用 .then facebook.github.io/jest/docs/en/asynchronous.html
-
@wuno,如果还没有完成,console.log('i'm here') 怎么会打印在测试用例中?
-
我不确定,但为什么不尝试使用建议的方法来处理承诺,看看是否有助于解决这个问题?我自己在测试 Promise 时遇到了很多问题。所以我理解你试图绕过你的头。您还会注意到,除非您将它们作为承诺处理,否则承诺不会返回预期的数据。如果你把它放在一个变量中并在控制台记录它,你会注意到它返回的值是不正确的。这将是一个代表承诺的长字符串。除非你使用 jest 提供的方法来解决一个承诺。
标签: javascript reactjs react-native jestjs enzyme