2016-08-23 71 views
0
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!'); 

這顯然是要提醒正確,這對這種情況是好的。但對於其他問題(甚至這個問題),我會想要多個測試用例,這就是我被卡住的地方。

那麼,我該如何測試多個測試用例,或者是否有其他方法來完成我正在嘗試實現的目標呢?

任何幫助/提示大爲讚賞,

對於那些誰知道陣營這裏的一些代碼,看看有點什麼,我目前有:

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> 
    ) 
    } 
}) 
+0

您可以用'的Math.random()'創建輸入和結果? – davidhu2000

回答

1

不要在用戶代碼中包含函數調用。只需要以某種方式命名該功能。而不是直接evaling的用戶代碼,嵌入到返回用戶的功能的功能:

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 
} 
+0

非常感謝。我正試圖實現這一權利。所以我把你的第二個代碼snippit放在我的evalCode函數中。我在哪裏放第一個代碼snippit(getUserFunction fn聲明)? – Apswak

+0

無論你想要什麼。你可以把它放在組件定義的上面,或者使它成爲組件的一個方法。由你決定。 –

0

可以遍歷一堆投入像這樣:

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) 
    } 
}