代码之家  ›  专栏  ›  技术社区  ›  volos

如何在Sinon JS中延迟假后端的特定响应

  •  2
  • volos  · 技术社区  · 7 年前

    View = Backbone.View.extend({
        el: ‘#app’,
        initialize: function () {
            var collection1 = new Collection1();// creates collection which can receive data from backend
            var collection2 = new Collection2(); // another one
    
            collection1.fetch().done(function() { // backbone sends the request for data to backend
                //render data1 which received from backend and append to el
            });
            collection2.fetch().done(function() {
                //render data2 which received from backend and append to el
            });
        }
    });
    

    两个集合发送不同的请求(不同的URL)。

    我知道如何延迟所有假冒后端的请求,但我不知道如何延迟其中一个请求。

    JSFiddle

    define(function(require) {
    
        //get all dependencies
    
        function testAsync(delayTime) { // make delay
            var deferred = $.Deferred();
            setTimeout(function() {
                deferred.resolve();
            }, delayTime);
            return deferred.promise();
        }
        describe('test ', function() {
            var view = null,
                server = null;
    
            beforeEach(function(done) {
                server = sinon.fakeServer.create(); // fake sinon server
                server.autoRespond = true;          // enable autoanswer
    
            testAsync(3000)                     // delay 3 sec
            .done(function(done) {
                    server.respondWith('GET', urlsForRequest.collection1, [
                        200,
                        {"Content-Type": "application/json"},
                        mockData1]);
                    server.respondWith('GET', urlsForRequest.collection2, [
                        200,
                        {"Content-Type": "application/json"},
                        mockData2]);
                    done(); // all is good go to it section, it's a jasmine func
                });
    
                view = new View(); // create Backbone View
    
            });
    
            afterEach(function() {
                server.restore();
            });
    
            it('can be instantiated', function() {
                // in this section need to use expect
            });
    
        });
    });
    

    这个测试延迟了所有的响应,但我只需要延迟一个响应。

    如何更改此代码以实现正确的测试?

    server.respondWith('GET', urlsForRequest.collection2, function(fakeRequest) {
        fakeRequest.autoRespond = true;
        fakeRequest.autoRespondAfter = 3000;
        fakeRequest.respond(200, {"Content-Type": "application/json"}, mockData2);
        done();
    });
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Community CDub    4 年前

    server.autoRespond = true; 在这种情况下。此外,您不需要 testAsync server.autoRespondAfter

    server.respondWith('GET', urlsForRequest.collection1, [
                    200,
                    {"Content-Type": "application/json"},
                    mockData1]);
    

    setTimeout(function(){
     server.respondWith('GET', urlsForRequest.collection2, [
                    200,
                    {"Content-Type": "application/json"},
                    mockData2]);
    }, 0);
    

    如果由于某种原因,这不起作用,最终您需要:

    boolean request.async

    请求是否异步。

    为了测试的目的,可以使它们同步,以确保一个接一个地完成。

        2
  •  1
  •   volos    7 年前

    首先,我禁用了所有 autoRespond 选项并删除 server.respond()

    下一个调试后,我发现在假服务器选项- queue 。如果您有很多请求,则此队列具有一个数组,其中包含对假服务器的所有假请求。存在特殊选项( firstRequest , secondRequest thirdRequest lastRequest ). 每个fakeRequest都有方法 respond(code, contentType-Object, body)

    因此,我的测试代码在所有更改实现后如下所示:

    define(function(require) {
    
        //get all dependencies
    
        describe('test ', function() {
            var view = null,
                server = null;
    
            beforeAll(function(done) {              // need to save view beetwen requests, change to beforeAll
                server = sinon.fakeServer.create(); // fake sinon server
                view = new View();                  // create Backbone View
                done();                             // run this jasmine-method to say jasmine - "All is good, run immediately tests in it-sections"
    
            });
    
            afterAll(function() {
                server.restore();
                view = null;
            });
    
            it('run response for second request by firstly', function() {
                server.secondRequest.respond(200,
                    {"Content-Type": "application/json"},
                    mockData2);
                // in this section need to use expect and check state of view
            });
            it('run response for first request by secondly', function() {
                server.firstRequest.respond(200,
                    {"Content-Type": "application/json"},
                    mockData1);
                // in this section need to use expect and check state of view
            });
    
        });
    });
    

    我的devDep:

    "devDependencies": {
        "jasmine-core": "^2.6.4",
        "karma": "^1.7.0",
        "karma-chrome-launcher": "^2.2.0",
        "karma-jasmine": "^1.1.0",
        "karma-phantomjs-launcher": "^1.0.4",
        "karma-requirejs": "^1.1.0",
        "karma-sinon": "^1.0.5",
        "sinon": "^2.3.6"
      }