Javascript 如何使用函数中的函数模拟Mocha和Sinon中的函数

Javascript 如何使用函数中的函数模拟Mocha和Sinon中的函数,javascript,coffeescript,mocha.js,sinon,chai,Javascript,Coffeescript,Mocha.js,Sinon,Chai,首先,我使用的是coffeescript,但我也会添加JS代码。我尝试了很多不同的方法,但在大多数情况下,一切都以尝试将未定义的属性undefined包装为function或类似的东西而告终。在假服务器的情况下,我得到了预期的0个结果,比如说20个 // As JS downloadResults = (function(_this) { return function(q) { var conn; conn = new s.AjaxRequest(que

首先,我使用的是
coffeescript
,但我也会添加JS代码。我尝试了很多不同的方法,但在大多数情况下,一切都以
尝试将未定义的属性undefined包装为function
或类似的东西而告终。在假服务器的情况下,我得到了预期的0个结果,比如说20个

// As JS
downloadResults = (function(_this) {
    return function(q) {
        var conn;
        conn = new s.AjaxRequest(queryString);
        conn.success = function(data) {
            return downloadResultsSuccess(data, q);
        };
        conn.error = function(data) {
            return downloadResultsError(data, q);
        };
        conn.post();
        return true;
    };
})(this);

# As coffee
downloadResults = (q) =>
    conn = new s.AjaxRequest queryString
    conn.success = (data) => downloadResultsSuccess data, q
    conn.error = (data) => downloadResultsError data, q
    conn.post()
    true
好的,那么我想测试什么呢?首先,我想模拟
s.AjaxRequest
位,以便在调用
conn.post()
时,使用伪
数据返回成功。接下来,我要确保在调用success else
downloadsresultserror
时调用函数
downloadsresultsuccess
。最后,在理想情况下,我想验证数据的有效性

以下是我尝试过的一些事情:

sinon.stub(s.AjaxRequest, 'post').yieldsTo('success', fakeData)

sinon.stub(s.AjaxRequest,'post')
    .withArgs('/fake/server/data.json')
    .returns({
        post: function() {
            return $.promise().done(fakeData);
        }
    });

server = sinon.fakeServer.create();
server.respondWith('POST', '/fake/server/data.json', [
    200, {
        'Content-Type': 'application/json'
    }, fakeData
]);

关于我下一步该做什么还有其他想法吗?

为什么要嘲笑这个?为什么不直接使用假服务器返回数据,然后尝试不同的场景呢?由于可以通过实际使用代码对其进行测试,因此对其进行模拟/监视几乎没有什么用处。在一个测试中,使假服务器以状态200响应,测试好路由,在另一个测试中使其以状态400响应,测试坏路由。那么,您可以将Ajax调用视为一个实现细节。@limelights,这就是我的开始,我只想测试一下是否使用正确的数据集调用了一次
downloadResultsSuccess
。这个类中还有其他变量决定需要返回哪种类型的数据,最终我也将对其进行测试。但是现在,请记住,
下载结果
不是一个
承诺
,我应该如何准确地测试响应是什么?在上面看到的
server.respondWith
之后,我的测试中有
className.downloadResults(q)
。从那里我该怎么做?成功处理程序必须返回正确的东西?因此,您可以使用mocha调用
done()
回调,然后对返回的值进行断言。