在前端测试 react + redux 应用程序时忽略与浏览器相关的变量
Ignoring browser-related variables while frontend testing react + redux app
我目前正在使用摩卡进行前端测试我的 react/redux 应用程序。
似乎每当我的函数中有与浏览器相关的变量时,测试就会失败。
例如,我的一个函数如下所示:
export const loginUserSuccess = (token, user) => {
localStorage.setItem('token', token); // browser-related variable here
return {
type: LOGIN_USER_SUCCESS,
payload: {
token: token,
user: user
}
}
}
注意我对localStorage
的使用。此变量在测试时显然不可用,因此任何碰巧触发loginUserSuccess
操作的测试都不会通过。老实说,我根本不需要测试 localStorage 逻辑——我只希望动作返回正确的东西。但即使我做这样的事情:
if (localStorage) localStorage.setItem('token', token);
我仍然收到一个错误,说本地存储未定义。如何让测试模块忽略某些变量?
另一个示例是当操作调用全局window
时。进行 API 调用时,我会让我的操作查看窗口以查看将其请求发送到何处:
export const createUserInAuthStore = (username, password) => {
let url = `${window.__BASE_URL__}/auth/user/` // look at the window here
let data = { username, password }
return request
.post(url)
.type('form')
.send(data)
.end()
.then((response) => {
return {
token: response.body.token,
username
}
})
.catch((error) => Promise.reject(error))
}
显然,摩卡抱怨第 3 行的窗口未定义。但即使我将那行固定为此:
let baseurl = window ? window.__BASE_URL__ : 'api.dockerhost'
摩卡继续抛出错误。
TL;DR:有没有办法在测试时忽略或替换与浏览器相关的变量?
在 mocha 中,所有全局可用的变量都以 global
为前缀。所以要嘲笑你的localStorage
,你可以这样做
global.localStorage = {
setItem: function () {}
}
对于您的窗口,您可以执行以下操作:
global.window = {
__BASE_URL__: "/bla/whatever"
}
并且不要忘记在之后再次删除它们以避免影响其他测试(我通常在afterEach()
函数中这样做)。
相关文章:
- 关闭浏览器后保存变量
- 在两个浏览器选项卡之间共享变量范围
- 浏览器's将AngularJS变量加载为URL
- 移动浏览器没有;t支持会话变量
- 为什么我不能在 node.js(浏览器化)的 require() 函数中使用变量作为参数
- 如何将宽度和高度变量设置为浏览器窗口的宽度和高度
- Angular:如何在外部浏览器中打开Angular变量-appgyver混合应用程序
- 网络浏览器正在成为“;严格的“;用于Javascript中未定义变量的操作
- 浏览器是否在选项卡之间传播javascript变量
- 从数组空值到浏览器刷新的 Javascript 变量
- 在前端测试 react + redux 应用程序时忽略与浏览器相关的变量
- 我们可以在浏览器会话中跨网页引用 JavaScript 变量吗?
- 如何在 Node 中访问模块全局变量.js例如浏览器中的 window.variable
- 在浏览器返回/forwd 按钮单击时保存/恢复所有 JavaScript 变量
- 给我的浏览器一个可通过javascript访问的全局变量
- JavaScript 警报函数如何在 Web 浏览器上的 java 字符串变量中工作
- 在(跨浏览器)JavaScript 中,何时必须在局部范围内缓存变量查找
- 变量和数组将在浏览器内存中保留多长时间
- 如何在使用谷歌浏览器开发者控制台时使变量在标签页中可见
- 如何避免节点.js中的浏览器变量