我正在尝试单元测试方法A.所有方法都是调用方法B(获取urlVars)。如果从方法A返回到B的结果等于传递给方法A的值,那么它必须返回true,否则返回false。
function A(result) {
if (B()["type"] === result) {
return true;
} else {
return false;
}
}
function B() {
do something
}
return something;
}
我试图确保函数B返回我使用sinon传递给函数A的相同值。有人可以提供帮助吗?
答案 0 :(得分:0)
简短回答可能是这样的:
// just for the example
var result = "test";
// function under test
function A(result) {
if (B()["type"] === result) {
return true;
} else {
return false;
}
}
//creating the stub
var B = sinon.stub()
// sets the return value of the Stub
B.returns({type:result});
// testing the function
console.info(A(result));

<script src="http://sinonjs.org/releases/sinon-1.17.5.js"></script>
&#13;
答案越长检查文档http://sinonjs.org/docs/#stubs。 问题是你真的需要 sinonjs ,还是你不能手写它?
通过单元测试,我总是手动编码 stubs / mocks / ...首先,当我开始编码时 很多或重复我使用框架。
更新: 有关单元测试的一些信息
(我希望这不是太基础,有助于解决您的问题)
如果我正在测试A
功能,我想知道如果功能A对我的成像方式做出反应。所以我创建了testCases
TestCase 1)如果我使用参数A
调用函数test
,结果应为true
。
TestCase 2)如果我使用参数A
调用函数test1
,结果应为false
。
......等等。
问题: 我只想测试来自A
的逻辑,而不是调用B
而不依赖{{1}的功能}}
解决方案:我模拟/存根/ ......它出来了。
这里我将如何接近它(在stackoverflow环境中)
B
&#13;
var passed = "<span style='color:green'>passed</span><br />";
var failed = "<span style='color:red'>failed</span><br />";
// Helper UnitTesting framework ;-)
function assertIsEqulaHelper(expected, actual){
document.write(expected===actual?passed:failed);
}
var B;
function testCase1(){
B = sinon.stub();
B.onCall(0).returns({type:"test"});
assertIsEqulaHelper(true, A("test"));
}
function testCase2(){
B = sinon.stub();
B.onCall(0).returns({});
assertIsEqulaHelper(false, A("test1"));
}
// function under test
function A(result) {
if (B()["type"] === result) {
return true;
} else {
return false;
}
}
testCase1();
testCase2();
&#13;
这必须进行优化,但它可以像这样工作。
最终更新:已提供代码的信息
<script src="http://sinonjs.org/releases/sinon-1.17.5.js"></script>