2014-01-24 5 views
7

Ich habe eine JavaScript-Funktion, die eine Post an eine Remote-API schreibt, die ich gerade schreibe, um einen Komponententest zu schreiben. Die Methode, die ich testen möchten, ist dies:QUnit, Sinon.js - Wie stelle ich sicher, dass Post to Fake Server den richtigen Anfragetext hat?

var functionToTest = function(callback, fail) { 
    $.ajax({ 
     url: "/myapi/", 
     type: "POST", 
     data: { one: 'one', two: 'two' }, 
     accept: "application/json", 
     contentType: "application/json" 
    }).done(function(x) { 
     log = generateLogMessage('Success'); 
     callback(log); 
    }).fail(function(x, s, e) { 
     log = generateLogMessage('Fail'); 
     fail(log); 
    }); 
} 

ich einen Komponententest haben (in QUnit Nutzung Sinon.js), die prüft, ob der Rückruf korrekt aufgerufen wird, wenn die Anforderung erfolgreich ist:

QUnit.test('Test that the thing works', function() { 

    var server = this.sandbox.useFakeServer(); 

    server.respondWith(
     'POST', 
     '/myapi/', 
     [ 
      200, 
      {'Content-Type': 'application/json'}, 
      '{"Success":true}' 
     ] 
    ); 

    var callback = this.spy(); 
    functionToTest(callback, callback); 
    server.respond(); 

    QUnit.ok(callback.calledWith(generateLogMessage('Success'))); 
}); 

Diese Test funktioniert, aber es wird erfolgreich zurückgegeben, unabhängig davon, was der Anfragetext ist. Was ich tun möchte, ist nur der Fake-Server antworten, wenn der Anfragekörper ist { one: 'one', two: 'two' }

Antwort

3

Ich würde vorschlagen, dass Sie filtered requests verwenden. Dies ist jedoch mit der aktuellen Implementierung von Sinon nicht möglich.

Auszug aus der Dokumentation:

einen Filter hinzufügen, ob oder nicht zu fälschen einen Antrag entscheiden wird. Der Filter wird aufgerufen, wenn xhr.open aufgerufen wird, mit den exakt gleichen Argumente (Methode, URL, async, Benutzername, Passwort). Wenn der Filter truthy zurückgibt, wird die Anfrage nicht gefälscht.

Sie haben keine Möglichkeit, die Daten zu filtern.

EDIT: Wenn ich das Problem richtig verstanden habe, könnten Sie in der Lage sein, so etwas zu tun:

functionToTest(...); 
var request = server.requests[0]; 
var data = JSON.parse(request.requestBody); 
if (data.one == 'one' && data.two == 'two') { 
    request.respond(200, jsonHeaders, JSON.stringify(specialResponse)); 
} 
else { 
    request.respond(200, jsonHeaders, JSON.stringify(otherResponse)); 
} 

ich, dass Code kennen das richtige Ergebnis bekommen, die Sie wollen, aber es gibt keine Möglichkeit, programmatisch erreiche das jetzt mit sinon.

+0

Danke, ich denke, ich werde weiter machen, was ich gerade mache. – BeardedCoder

10

Fast zwei Jahre später nun, aber immer noch relevant:

Dies kann, indem ein Funktion anstelle eines Arrays als dritter Parameter zu server.respondWith erreicht werden. Die Funktion benötigt ein Argument 'request', auf dem Sie request.respond(statusCode, headers, body);

aufrufen können Sie müssen noch die Werte aus request.requestBody extrahieren, aber zumindest ist es machbar.

QUnit.test('Test that the thing works', function() { 

    var server = this.sandbox.useFakeServer(); 

    server.respondWith(
     'POST', 
     '/myapi/', 
     function (request) { 
      console.log(request.requestBody); // <- assert here :-) 
      request.respond(200, {'Content-Type': 'application/json'}, '{"Success":true}'); 
     } 
    ); 

    var callback = this.spy(); 
    functionToTest(callback, callback); 
    server.respond(); 

    QUnit.ok(callback.calledWith(generateLogMessage('Success'))); 
}); 
+0

Nette Idee, danke! – Johan

+0

Der Code für xhr.respond: https://github.com/sinonjs/sinon/blob/fd56d7f0c2c749e21475a630bee99ffdbc090516/lib/sinon/util/fake_xdomain_request.js#L150 – luqmaan

+0

Dies sollte jetzt die echte Antwort sein – jesantana

Verwandte Themen