- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 React 中有一个小组件,它在渲染时生成两个随机数,然后要求用户提交这些数字的总和,如果它们正确,则增加他们的分数。
以下代码处理此游戏并在浏览器中按预期运行:
import React, { Component } from 'react';
export const randomNumber = () => {
var maxNumber = 10;
var randomNumber = Math.floor((Math.random() * maxNumber) + 1);
return randomNumber;
}
class Arithmetic extends Component {
constructor(props) {
super(props);
this.state = {
value: '',
numbers: {
x: randomNumber(),
y: randomNumber()
},
score: ''
}
this.updateVals = this.updateVals.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.handleChange = this.handleChange.bind(this);
}
updateVals() {
this.setState({
numbers: {
x: randomNumber(),
y: randomNumber()
},
score: this.state.score + 1
});
}
componentDidMount() {
this.setState({
score: 0
});
}
handleChange(event) {
this.setState({value: event.target.value});
}
handleSubmit(event) {
var isCorrect = this.state.numbers.x + this.state.numbers.y == this.state.value ? this.updateVals() : alert("Try again");
event.preventDefault();
}
render() {
return (
<section className="arithmetic">
<div className="arithmetic__game">
<div className="row arithmetic__row--details">
<div className="arithmetic__score">
Score: {this.state.score}
</div>
<div className="arithmetic__timer">
</div>
</div>
<div className="row arithmetic__row--main">
<div className="arithmetic__examples">
1 + 1 = 2<br/>
2 + 1 = 3<br />
</div>
<div className="arithmetic__game-container">
What is {this.state.numbers.x} + {this.state.numbers.y}?
<div className="arithmetic__form-container">
<form onSubmit={this.handleSubmit}>
<label>
Answer:
<input className="input-field" type="text" value={this.state.value} onChange={this.handleChange} />
</label>
<button className="btn-submit" type="submit" onClick={(e) => (this.handleSubmit) ? this.handleSubmit(e) : null}>Submit</button>
</form>
</div>
</div>
</div>
</div>
</section>
);
}
};
但是,当尝试检查是否在正确输入两个数字的总和时调用 updateVals 时,此操作失败。我已经检查过是否在模拟单击“提交”按钮时调用了 handleSubmit,并且它被调用了。我还检查了 value 和 numbers 属性的值,看看状态是否已正确更新,它们已经更新了。
但是,当调用 updateVals 时,分数会增加(同样,这会显示在浏览器中)。但是,当我尝试在 Jest 中对此进行模拟时,分数仍保持为 0,就像它初始化时一样。
我的测试如下:
it("passes with correct input", () => {
const updateVals = jest.fn();
const handleSubmit = jest.fn();
Arithmetic.prototype.updateVals = updateVals;
Arithmetic.prototype.handleSubmit = handleSubmit;
let wrapper = mount(<Arithmetic />);
wrapper.find('.input-field').instance().value = wrapper.update().state().numbers.x + wrapper.update().state().numbers.y;
expect(wrapper.find('.input-field').instance().value).toEqual((wrapper.update().state().numbers.x + wrapper.update().state().numbers.y).toString());
wrapper.find('.input-field').simulate('change');
wrapper.find('.btn-submit').simulate('click');
console.log(wrapper.update().state().numbers.x, wrapper.update().state().numbers.y, wrapper.update().state().value);
expect(updateVals).toHaveBeenCalled();
});
在终端中运行测试表明,例如,如果 numbers.x 是 1 并且 numbers.y 是 9 那么 state 中的值键是 '10'。我不确定为什么当我测试 handleSubmit 时,它被调用并且测试通过但 updateVals 没有。
最佳答案
我设法让它工作,我从提交按钮中删除了所有事件,并测试了已经调用 onSubmit 的表单本身,并测试了分数本身是否在状态中更新。
it("passes with correct input", () => {
const wrapper = shallow(<Arithmetic />);
const preventDefault = jest.fn();
const currentScore = wrapper.update().state().score;
wrapper.find('.input-field').simulate('change', {target: {value: wrapper.update().state().numbers.x + wrapper.update().state().numbers.y}});
wrapper.find('.main-form').simulate('submit', { preventDefault });
expect(wrapper.update().state().score).toEqual(currentScore+1);
});
关于javascript - Jest : Unit test toHaveBeenCalled() not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50882849/
我有一个函数,它只是创建一个写入流并写入它...我想测试该函数,并测试 createWriteStream 的 write() 函数> 被调用。但是,我正在 mock fs 模块,因为我不想在测试时实
据我所知, Jasmine 的 .toHaveBeenCalled() Matcher 返回一个 Promise,该 Promise 在函数被调用时被解析。实际上对我来说,它返回未定义: it('sh
什么时候应该调用这些方法中的每一个,为什么? const spyStart = spyOn(el, 'func1'); expect(spyStart).toHaveBeenCalled(); con
我正在使用 Composition API 和 setup() Hook 运行 vue3 应用程序。 我使用 Vitest 作为单元测试框架。 (v 0.6.1) 我有以下示例组件: // src/c
我在进行这个简单的测试时遇到了很多麻烦。 我在想要测试的 Controller 中有一个 $scope.$on 监听器。我只是想确保它在广播事件之后被调用。 为此,我认为以下代码可以工作: descr
我正在使用 Composition API 和 setup() Hook 运行 vue3 应用程序。 我使用 Vitest 作为单元测试框架。 (v 0.6.1) 我有以下示例组件: // src/c
谁能告诉我为什么以下测试失败。 var Person = function() {}; Person.prototype.helloSomeone = function(toGreet) { re
我正在使用 Enzyme/Jest 为容器帽子上的函数编写测试,该函数是通过复选框组件的 onChange 触发的。我正在尝试模拟“更改”,但是,“更改”以某种方式没有触发调用 onChange 函数
这是测试代码 var list = new List([1, 2, 3, 4]); var list2 = new List([5, 1]); beforeAll(function () { sp
我在 React 中有一个小组件,它在渲染时生成两个随机数,然后要求用户提交这些数字的总和,如果它们正确,则增加他们的分数。 以下代码处理此游戏并在浏览器中按预期运行: import React, {
我是 jasmine 的新手,这是我的 src 文件,我在其中创建了 Auth 类 function Auth() { } Auth.prototype.isEmpty = function(str)
使用 Jest 和 React,我如何监视一个 this.setState()并测试功能 hasBeenCalled() it('shall update targets when engine re
我正在尝试测试是否使用 enzyme 和 jest 调用了 React 组件方法。该函数应该在 时被调用。元素变得没有焦点(模糊)。该组件连接到 Redux 存储,但它也按名称导出,以将 Redux
被测代码: module lib { export class Topic { private _callbacks: JQueryCallback; publ
我目前在监视 typescript 类中调用的继承方法时遇到问题,其中 toHaveBeenCalled() 方法返回 false,即使被监视的方法已被调用。看看下面的场景... 我有两个类,用 Ty
我正在尝试对返回 promise 的函数进行单元测试。我在验证是否模拟函数被调用。这是我所做的。, // codetotest.js const { SomeModule, isSomething,
我的监视方法的示例失败,并显示“预期 spy handle_click已被调用”。当它应该过去的时候。但是,我收到控制台日志“Foo handle_click called!”,所以我知道它正在被调用
一个简单的组件: {{ count }} Increment export default { data () { r
我正在尝试 stub /监视翻译,而不仅仅是 mock 它,即使在这种最基本的情况下,我似乎也无法触发它。 /** * ComponentName.jsx */ import { useTrans
我是一名优秀的程序员,十分优秀!