【问题标题】:How to test a function with different inputs如何测试具有不同输入的函数
【发布时间】:2016-08-23 23:36:43
【问题描述】:
function addTwo (a, b) {
  return a + b;
}

//Leave the function call
addTwo(50, 100);

我正在学习 React,我正在尝试创建一个 codecademy 类型的网站作为“学习项目”,但遇到了 JS 问题。

假设你有上面的功能,你如何测试不止一种情况?到目前为止,我正在测试:

eval(CODE PULLED IN HERE) === 150 ? alert('Correct!') : alert('Wrong!'); 

这显然会提醒正确,这对于这种情况是可以的。但是对于其他问题(甚至是这个问题),我需要不止一个测试用例,这就是我遇到的问题。

那么,我如何测试多个测试用例,或者是否有完全其他的方式来完成我想要实现的目标?

非常感谢任何帮助/提示,​​

对于那些了解 React 的人,这里有一些代码可以查看我目前拥有的一些内容:

const CodeEditor = React.createClass({
  getInitialState () {
    var initialValue = [
      "function addTwo () {",
      "  ",
      "}",
      "//Leave the function call",
      "addTwo(50, 100);"
  ].join("\n");

    return {
      kataValue: initialValue
    }
  },
  onChange (newValue) {
    this.setState({kataValue: newValue});
  },
  evalCode () {
    var val = this.state.kataValue
    eval(val) === 150 ? alert('Correct!') : alert('Wrong!');
  },
  render () {
    return (
      <div className="code-editor-wrapper">
        <AceEditor
          name="editor"
          mode="sh"
          theme="chaos"
          onChange={this.onChange}
          value={this.state.kataValue}
          editorProps={{$blockScrolling: true}}
        />
      <button onClick={this.evalCode} className="spec-btn submit-code-btn">Evaluate</button>
      </div>
    )
  }
})

【问题讨论】:

  • 您可以使用Math.random() 创建输入和结果吗?

标签: javascript function unit-testing testing reactjs


【解决方案1】:

不要在用户代码中包含函数调用。只要求函数以某种方式命名。不是直接评估用户的代码,而是嵌入到返回用户函数的函数中:

function getUserFunction(code, functionName) {
  var userCode = new Function(code + '; return ' + functionName + ';');
  return userCode();
}

在调用getUserFunction 之后,您将获得对用户编写的函数的引用,您可以根据需要随时执行它。如何构建测试用例以及想向用户提供多少反馈取决于您。

这是一个小例子:

var userFn = getUserFunction(this.state.kataValue, 'addTwo');
var testCases = [
  [[50, 100], 150],
  [[1, 2], 3],
];
var passes = testCases.every(
  ([input, output]) => userFn(...input) === output
);
if (passes) {
  // all test cases pass
}

【讨论】:

  • 非常感谢。我现在正在尝试实现这一点。所以我把你的第二个代码片段放在我的 evalCode 函数中。我应该把你的第一个代码片段(getUserFunction fn 声明)放在哪里?
  • 随心所欲。你可以把它放在组件定义之上,或者让它成为组件上的一个方法。由你决定。
【解决方案2】:

你可以像这样迭代一堆输入:

function addTwo(a, b) {
  return a + b
}
for (var i = 0, j; i < 100; i++) {
  for (j = 0; j < 100; j++) {
    if (addTwo(i, j) !== i + j) console.error('Wrong output for inputs ' + i + ' and ' + j)
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2017-08-17
    相关资源
    最近更新 更多