不确定如何使用 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);