- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 javascript 新手,我一直在尝试为他的代码编写测试,但我无法做到,我们应该使用 Jest 。研究了很久没有找到解决办法。
document.getElementById("signup").addEventListener("submit", function(e) {
e.preventDefault();
data = {
username: document.getElementById("username").value,
email: document.getElementById("email").value,
password: document.getElementById("password").value,
confirm_password: document.getElementById("confirmPassword").value,
};
});
signUp = (data) => {
fetch("https://diaryapi-v2.herokuapp.com/mydiary/v1/auth/register", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(data)
})
.then(res => res.json())
.then(data => {
if (data.message === "Your account was created") {
let msg = data.message;
document.getElementById("white").innerHTML = msg;
window.location.href = "/signin";
} else {
let msg = Object.values(data);
console.log(msg)
document.getElementById("white").innerHTML = msg;
}
})
.catch(error => console.error("Error:", error));
}
最佳答案
您的代码没有任何导出,因此您需要在您希望运行的测试中使用 require()
。
它发出网络请求并设置窗口位置,因此您将需要使用 Mocks Functions验证它是否按预期工作,而无需实际发出网络请求并设置窗口位置。
它通过使用给 then()
的回调来异步执行一些工作,因此您需要在测试中考虑到这一点。
Jest
使用 jsdom
在单元测试中提供类似浏览器的环境,您可以在使用 require( 运行代码之前使用它来设置所有内容)
。
我对下面评论中提到的代码做了一些小修改:
<小时/>代码.js
document.getElementById("signup").addEventListener("submit", function (e) {
e.preventDefault();
// add 'const'
const data = {
username: document.getElementById("username").value,
email: document.getElementById("email").value,
password: document.getElementById("password").value,
confirm_password: document.getElementById("confirmPassword").value,
};
signUp(data); // call signUp with the data
});
// add 'const'
const signUp = (data) => {
fetch("https://diaryapi-v2.herokuapp.com/mydiary/v1/auth/register", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(data)
})
.then(res => res.json())
.then(data => {
if (data.message === "Your account was created") {
let msg = data.message;
document.getElementById("white").innerHTML = msg;
window.location.assign("/signin"); // change this to assign() so it can be mocked
} else {
let msg = Object.values(data);
console.log(msg)
document.getElementById("white").innerHTML = msg;
}
})
.catch(error => console.error("Error:", error));
}
<小时/>
这是上述代码的工作测试,您可以将其用作引用:
代码.test.js
describe('code', () => {
let fetchMock;
let assignMock;
beforeEach(() => {
// Jest uses jsdom as the default test environment which emulates
// a browser and provides a document object for the unit tests.
// Initialize the document body with the HTML needed for the tests
document.body.innerHTML += `
<form id="signup">
<input type="text" id="username" value="the username">
<input type="text" id="email" value="the email">
<input type="text" id="password" value="the password">
<input type="text" id="confirmPassword" value="the confirmPassword">
<input type="submit" id="submitbutton">
</form>
<div id="white"></div>
`;
// Create a mock for fetch and provide a mock implementation
// so the unit tests aren't actually making network requests
fetchMock = jest.spyOn(global, 'fetch');
fetchMock.mockImplementation(() => Promise.resolve({
json: () => Promise.resolve({ message: 'Your account was created' })
}));
// Create a mock for window.location.assign()
// so the unit tests aren't actually changing the window location
assignMock = jest.spyOn(window.location, 'assign');
assignMock.mockImplementation(() => {});
// With everything set up, require the code
require('./code');
});
afterEach(() => {
// After each test call mockRestore() to restore the original functions
fetchMock.mockRestore();
assignMock.mockRestore();
// resetModules() resets the module registry in Jest and ensures
// a fresh copy of './code' executes on require()
jest.resetModules();
});
it('should fetch data, change contents of #white, and change the page location on submit', async () => {
// Submit the form
document.getElementById('submitbutton').click();
// Check that fetch was called with the expected arguments
expect(fetchMock).toHaveBeenCalledTimes(1);
const fetchArgs = fetchMock.mock.calls[0];
expect(fetchArgs[0]).toBe('https://diaryapi-v2.herokuapp.com/mydiary/v1/auth/register');
expect(fetchArgs[1]).toEqual({
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
username: 'the username',
email: 'the email',
password: 'the password',
confirm_password: 'the confirmPassword',
})
});
// pause synchronous execution of the test for two event loop cycles
// so the callbacks queued by the then()'s within signUp have a chance to run
await Promise.resolve().then();
// Check that window.location.assign() was called with the expected arguments
expect(assignMock).toHaveBeenCalledTimes(1);
expect(assignMock.mock.calls[0][0]).toBe('/signin');
// Check that #white was updated
expect(document.getElementById('white').innerHTML).toBe('Your account was created');
});
});
关于jestjs - 我如何使用 jest 来测试带有 DOM 元素的 javascript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51909760/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
Polymer的light DOM和local DOM有什么区别?来自文档(1): The DOM that an element creates and manages is called its
当内容添加到网页时,我需要触发一个 Action 。更新可能具有不同的性质(例如 AJAX、延迟脚本、用户操作)并且不受我的控制。 我想使用 DOM 突变事件,但它们并非在所有浏览器中都可用。是否有为
我刚遇到一个有趣的情况,我有一个提交 放置在 内的 native 自定义元素的 Shadow DOM 内. Select #shadow-root ...
假设有一个滚动列表,当我插入一些新的 DOM 附加到当前 dom 时,它工作正常。上拉 但是如果我之前插入一些新的 DOM,新的 DOM 将在视口(viewport)中,而旧的 DOM 将被下推。下拉
在我的项目中实现 Shadow DOM 是否会使它们像 React 使用的虚拟 DOM 一样更快? 最佳答案 它们是不同用途的不同事物,因此比较性能没有意义。 虚拟 DOM 虚拟 DOM 旨在避免对
在我的页面内容上,我将多张卡片组织成网格 __________________ | ____ ____ | | | | | | | | | | | |
是否可以在浏览器中看到(调试)从 DOM 元素触发的自定义事件? 假设我想查看 Bootstrap Collapse 的哪个特定元素触发了 show.bs.collapse event ,我能以某种方
我正在生成用于客户端的 XPaths 服务器端,我很困惑为什么在 DOM 中找不到表路径(即 td 中的内容)。 事实证明,现代浏览器(至少是 Chrome 和 Firefox)插入了 tbody在文
是否可以检索文本节点的几何位置(即从父元素、页面等的顶部/左侧偏移量)? 最佳答案 不是直接的。 TextNode 没有用于测量视口(viewport)定位的原始 IE 偏移*(和类似的)扩展。 仅在
以下语句中的 DOM 元素的含义是什么? Statement #1 You can add multiple classes to a single DOM element. Statement #2
有没有办法让 firebug(或任何其他浏览器,或使用任何其他工具)阻止任何 dom 操作的发生?有时布局调试充满悬停事件的屏幕是不可能的,因为元素可能会消失,并且您看不到它们的复合布局。 最佳答案
我需要在html文档中搜索 text here 然后输出完整的节点路径(CSS或XPATH) 例如 html > body > div class ="something" > table > tr
这是我的一个页面的典型加载时间如何拆分为:- Domain Lookup 0 0 % Connect 134 .3% Request
我的 .on() 工作时遇到一些问题。我的网站是here . 如果你看看 www.eliteweb-creation.co.uk/dev/js/nav.js,我正在 mouseenter 和 mous
我是 Javascript 的新手,负责将我们产品的 UI 从 YUI2 迁移到 YUI3。看起来哪里都没有迁移指南,所以我现在正在浏览互联网帖子和 yui 文档。 在我的全局范围内,我临时添加了类似
我想和实习生一起测试一些 DOM 相关的东西,不需要特定的固定装置,只是一般的 DOM 东西,比如我改变了 Element.prototype。这是否需要通过本地 Selenium 服务器(或 sau
我是 HTML 和 HTML5 的初学者。 当我阅读以下内容时 link ,我找到了术语 DOM 和 DOM API。我通读了维基百科,但无法理解其背后的全部思想。 谁能给我解释一下: 文档对象模型
我有两个主要问题。 Object 之类的扩展是否算数? 什么是 DOM 包装? http://perfectionkills.com/whats-wrong-with-extending-the-do
对不起查询,原型(prototype),雅虎 YUI,道场在考虑小的时候不吸引我。我想要一个模块化的库,代码尽可能小,最多 20Kb [un compressed] 是我所期望的。应该提供 Dom 操
我是一名优秀的程序员,十分优秀!