不确定如何使用 sinon 对 qunit 进行存根
Not sure how to stub using sinon for qunit
我正在尝试对方法 A 进行单元测试。该方法所做的只是调用方法 B(获取 urlVars)。如果从方法 A 到 B 的结果 return 等于传递给方法 A 的值,则它必须 return 为真,否则它 return 为假。
function A(result) {
if (B()["type"] === result) {
return true;
} else {
return false;
}
}
function B() {
do something
}
return something;
}
我试图确保函数 B return 与我使用 sinon 传递给函数 A 的值相同。有人可以帮忙吗?
简短的回答大概是这样的:
// 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>
较长的答案 是查看文档 http://sinonjs.org/docs/#stubs。
问题是你真的需要sinonjs,还是可以不用handcode?
By unit testing I would always handcode stubs/mocks/... first, and when I start coding to
much or duplicating a lot I use a framework.
更新:单元测试的一些信息
(希望这不是太基础,有助于解决您的问题)
如果我正在测试 A
函数,我想知道函数 A 是否会像我想象的那样做出反应。所以我创建了 testCases
测试用例 1) 如果我用参数 test
调用函数 A
,结果应该是 true
.
TestCase 2) 如果我用参数 test1
调用函数 A
,结果应该是 false
.
...等等。
问题:我只想测试A
的逻辑,没有调用B
也没有依赖 B
的功能
解决方案:我mock/stub/...解决了。
这里我将如何处理它(在 Whosebug 环境中)
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();
<script src="http://sinonjs.org/releases/sinon-1.17.5.js"></script>
This would have to be optimized, but it can work like this.
最终更新:信息已集成到提供的代码中
var expected = true;
var returnValue = "something";
var B = sinon.stub();
B.returns({type: returnValue});
//Act
var actual = A(returnValue); //use webm or local
//Assert
deepEqual(actual, expected);
我正在尝试对方法 A 进行单元测试。该方法所做的只是调用方法 B(获取 urlVars)。如果从方法 A 到 B 的结果 return 等于传递给方法 A 的值,则它必须 return 为真,否则它 return 为假。
function A(result) {
if (B()["type"] === result) {
return true;
} else {
return false;
}
}
function B() {
do something
}
return something;
}
我试图确保函数 B return 与我使用 sinon 传递给函数 A 的值相同。有人可以帮忙吗?
简短的回答大概是这样的:
// 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>
较长的答案 是查看文档 http://sinonjs.org/docs/#stubs。 问题是你真的需要sinonjs,还是可以不用handcode?
By unit testing I would always handcode stubs/mocks/... first, and when I start coding to much or duplicating a lot I use a framework.
更新:单元测试的一些信息
(希望这不是太基础,有助于解决您的问题)
如果我正在测试 A
函数,我想知道函数 A 是否会像我想象的那样做出反应。所以我创建了 testCases
测试用例 1) 如果我用参数 test
调用函数 A
,结果应该是 true
.
TestCase 2) 如果我用参数 test1
调用函数 A
,结果应该是 false
.
...等等。
问题:我只想测试A
的逻辑,没有调用B
也没有依赖 B
的功能
解决方案:我mock/stub/...解决了。
这里我将如何处理它(在 Whosebug 环境中)
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();
<script src="http://sinonjs.org/releases/sinon-1.17.5.js"></script>
This would have to be optimized, but it can work like this.
最终更新:信息已集成到提供的代码中
var expected = true;
var returnValue = "something";
var B = sinon.stub();
B.returns({type: returnValue});
//Act
var actual = A(returnValue); //use webm or local
//Assert
deepEqual(actual, expected);