我目前正在测试使用memoization + recursion的Fibonacci算法.
function memoization(num, hash = {'0': 0, '1':1}) {
if (!hash.hasOwnProperty(num)) {
hash[num] = memoization(num-1,hash) + memoization(num-2,hash);
}
return hash[num];
}
Run Code Online (Sandbox Code Playgroud)
我想在Jest中测试函数的memoization方面,以确保函数正确使用哈希并且不执行冗余工作:
test('is never run on the same input twice', ()=>{
fib.memoization = jest.fn(fib.memoization);
fib.memoization(30);
expect(allUniqueValues(fib.memoization.mock.calls)).toBeTruthy();
});
Run Code Online (Sandbox Code Playgroud)
但是,mock.calls仅报告使用初始参数值调用此函数一次,并且不跟踪其他递归调用.有任何想法吗?
我想测试在模拟按钮单击时调用了从 mapDispatchToProps 传递的函数。
如何测试从 mapDispatchToProps 传递的函数被调用?
我试图通过道具传递一个模拟函数,但它不起作用。任何帮助将不胜感激。
下面是我的假类代码和测试示例。
我的组件
// All required imports
class App extends React.Component<Props> {
render() {
const { onClick } = this.props;
return (
<>
<h1>Form</h1>
<input />
<button onClick={() => onClick()} />
</>
);
}
}
const mapStateToProps = (state) => {
return {
state
};
};
const mapDispatchToProps = (dispatch) => {
return {
onClick: () => dispatch(actions.onClick())
};
};
export default connect(mapStateToProps, mapDispatchToProps)(App);
Run Code Online (Sandbox Code Playgroud)
我的测试文件
import { configure, mount } from 'enzyme';
import Adapter …Run Code Online (Sandbox Code Playgroud) 如何解决我的情况?以下功能的Jest + Enzyme测试返回
TypeError: window.getSelection is not a function
Run Code Online (Sandbox Code Playgroud)
我的代码:
_addNewAgent () {
window.getSelection().removeAllRanges();
const newAgent = generateNewAgent();
const newDataBase = this.state.agentsDatabase;
newDataBase.push(newAgent);
this.setState({
currentAgentProfile: newAgent,
agentsDatabase: newDataBase,
infoDisplayContent: 'profile'
});
}
Run Code Online (Sandbox Code Playgroud)
我的测试:
import React from 'react';
import { mount } from 'enzyme';
import App from '../containers/App';
const result = mount(
<App />
);
test('add agent', () => {
const agentsList = result.state().agentsDatabase.length;
result.find('#addNewAgent').simulate('click');
expect(result.state().agentsDatabase.length).toBe(agentsList + 1);
expect(result.state().currentAgentProfile)
.toEqual(result.state().agentsDatabase[agentsList]);
expect(result.state().infoDisplayContent).toBe('profile');
});
Run Code Online (Sandbox Code Playgroud) 我有一个带有模态对话框的React组件(使用构建reactstrap,但其他人报告了类似的问题react-bootstrap和其他类型的模态组件).尽管它们在实际应用程序中渲染得很好,但是酶无法在模态中找到任何组件.最小的例子:
import React from 'react'
import { Modal } from 'reactstrap'
export default class MyModal extends React.Component {
render() {
return (
<div className="outside"> Some elements outside of the dialog </div>
<Modal isOpen={this.props.modalOpen}>
<div className="inside"> Content of dialog </div>
</Modal>
);
}
}
Run Code Online (Sandbox Code Playgroud)
我想像这样测试内容(在这种情况下使用jest)
import React from 'react'
import MyModal from './MyModal'
import { mount } from 'enzyme'
it('renders correctly', () => {
const wrapper = mount( <MyModal modalOpen/> );
expect(wrapper).toMatchSnapshot();
// Passes
expect(wrapper.find('.outside')).toHaveLength(1); …Run Code Online (Sandbox Code Playgroud) 我已经整理了一个很好的基本联系表格.但是我现在需要开始编写我的单元测试,并且遇到了大量问题(比如我到目前为止只能设法获得快照测试).
首先,如果您没有填写所有必需的部分,那么当您单击"提交"按钮时,我正在尝试测试表单应该呈现我的验证消息.
我以为我可以通过调用handleSubmit()函数来实现这个目的:
componentRender.find('Formik').instance().props.handleSubmit(badFormValues, { resetForm });
但是,当我运行时componentRender.debug(),我的验证消息没有被渲染.这就像没有调用validationSchema函数?
有什么特别需要做的吗?我觉得这个mapPropsToValues()函数正在工作,从查看状态对象,它正在填充我传递表单的值.我只是不明白为什么验证似乎被跳过了?
我已经在这2天了,并且通过谷歌找不到任何好的例子(可能是我的错)所以任何帮助都会受到大力赞赏.
这里是参考测试文件到目前为止:
import React from 'react';
import { shallow, mount } from 'enzyme';
import { BrowserRouter as Router } from 'react-router-dom';
import PartnerRegistrationForm from 'Components/partner-registration-form/PartnerRegistrationForm';
describe('PartnerRegistrationForm component', () => {
const formValues = {
companyName: 'some company',
countryCode: 'GB +44',
telNumber: 12345678,
selectCountry: 'United Kingdom',
postcode: 'ABC1 234',
addressSelect: '123 street',
siteName: 'blah',
siteURL: 'https://www.blah.com',
contactName: 'Me',
email: 'me@me.com',
};
const componentShallow = shallow(<PartnerRegistrationForm {...formValues} …Run Code Online (Sandbox Code Playgroud)这是我组件的简化版本:
import React from 'react';
import { observable, action } from 'mobx';
import { observer } from 'mobx-react';
import { fromPromise } from 'mobx-utils';
@observer
export class MyComponent extends React.Component {
@action componentDidMount() {
const { store, params } = this.props;
this.warehouse = store.findById(params.id);
}
@observable warehouse = fromPromise(Promise.resolve());
render() {
return this.warehouse.case({
fulfilled: (value) => (
<div>
fulfilled
</div>
),
rejected: (error) => (
<div>
rejected
</div>
),
pending: () => (
<div>
pending
</div>
)
});
}
} …Run Code Online (Sandbox Code Playgroud) 使用Chai,您可以创建一个间谍对象,如下所示:
chai.spy.object([ 'push', 'pop' ]);
Run Code Online (Sandbox Code Playgroud)
使用茉莉花,您可以使用:
jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']);
Run Code Online (Sandbox Code Playgroud)
什么是Jest等价物?
上下文:我目前正在将(打字稿)Jasmine测试迁移到(typescript)Jest.在这种情况下,迁移指南基本上没用:https://facebook.github.io/jest/docs/migration-guide.html与任何相对较新的技术一样,在这方面的文档中没有任何东西可以轻易找到.
我正在尝试使用Jest重新构建一个Node项目进行测试.起初,我有我的所有.js,并.test.js在同一目录中的文件,并且一切都很好在世界- 即 jest --coverage做了我的预期.
我现在改变了我的目录结构,测试工作,但我的报道报告没有.
这是我的目录结构,编辑删除node_modules 除了我的lib文件夹的符号链接.我正在通过符号链接关注我的模块提示requiring.
? tree
.
??? README.md
??? build
? ??? index.js
??? jest.config.js
??? lib
? ??? path.js
? ??? pen.js
? ??? section.js
? ??? sprite.js
? ??? utilities.js
??? node_modules
? ??? itch <= symlink to my `lib` folder
??? package-lock.json
??? package.json
??? test
??? env
? ??? foo.html
??? path.test.js
??? pen.test.js
??? section.test.js
??? sprite.test.js
??? utilities.test.js …Run Code Online (Sandbox Code Playgroud) 我正在编写一个 React 组件,它将在 iframe 中加载 URL,然后当 iframe 的 onLoad 事件触发时,它将调用 contentWindow.postMessage()。我想使用 Jest、Enzyme 和 JSDOM 来证明此功能。
我的组件包装了react-iframe,看起来非常简单:
export class FilteredIframe extends React.PureComponent<FilteredIframeProps> {
onload = (e:Window) => {
console.log("ONLOAD CALLED");
if (this.props.filters) {
e.postMessage(this.props.filters, this.props.url);
}
}
render() {
return (<Iframe url={this.props.url}
display="initial"
position="static"
onLoad={this.onload}
/>);
}
}
Run Code Online (Sandbox Code Playgroud)
我试图找出如何让酶/jsdom 来测试这个,但我失败了:
test("Posts message once the frame has loaded", async () => {
const payLoad = { data: "data" };
const result = mount(<FilteredIframe url="https:///www.bing.com" filters={payLoad}/>);
})
Run Code Online (Sandbox Code Playgroud)
当开玩笑地运行这个时,我从未在控制台中看到“ONLOAD CALLED”消息。我需要为 jsdom 或酶做一些特殊的事情才能使其真正调用 onLoad 吗?
我在使用 jest 进行测试时遇到以下错误。我在这里使用非 es6 npm 包。当我不想进行任何通配符 * 导入时,就会出现此问题。我想做显式导入。
\n\n//code\n\nimport sha256 from "crypto-js/sha256";\n\nexport const GetHashToken = (value) => {\n return sha256(value);\n};\n\n//test\n\nimport { GetHashToken, GetUtcTimeStamp } from \n"../../utils/ScheduleRepairUtility";\n\ndescribe("Get hash token utility", () => {\n it("Should return sha-256 hex digit string for given value", () => {\n const paramValue = "78436783465sears121212"; \n expect(GetHashToken(paramValue))\n .toBe("b87663752c7f5bf0967f74fd3523dece543\n f447e96d9b1d478c7336781e1828b");\n });\n});\nRun Code Online (Sandbox Code Playgroud)\n\n出现错误:
\n\n\xe2\x97\x8f Get hash token utility \xe2\x80\xba Should return sha-256 hex digit string for \n given value\n\nTypeError: sha256_1.default is not a function\nRun Code Online (Sandbox Code Playgroud)\n\n我正在为我的项目使用react-typescript。任何帮助表示赞赏。 …
jestjs ×10
reactjs ×7
enzyme ×6
javascript ×2
unit-testing ×2
bdd ×1
ecmascript-6 ×1
formik ×1
jsdom ×1
mobx ×1
mobx-react ×1
modal-dialog ×1
node.js ×1
recursion ×1
redux ×1
testing ×1
typescript ×1
webpack ×1