2015-04-19 7 views
6

Ich bin neu beim Testen und versuche zu verstehen, wie man eine ziemlich einfache Controller-Aktion testet. Das Problem, auf das ich stoße, ist nicht zu wissen, wie man die Methoden, die sich im Controller befinden, verspotten oder sogar darüber nachdenken, wann es angebracht ist.Wie Methode in Controller in sails.js mit Mocha + Sinon testen?

Die Aktion erstellt einen ausstehenden Benutzer in der DB meiner Webanwendung und gibt einen Join-Link zurück. Es sieht wie folgt aus:

'use strict'; 
/** 
* Tests for PendingUserController 
*/ 

var PendingUserController = require('../../api/controllers/PendingUserController.js'), 
     sinon = require('sinon'), 
     assert = require('assert'); 

describe('Pending User Tests', function(done) { 

    describe('Call the create action with empty user data', function() { 
     it('should return 400', function(done) { 

      // Mock the req object. 
      var xhr = sinon.useFakeXMLHttpRequest(); 
      xhr.allParams = function() { 
       return this.params; 
      }; 
      xhr.badRequest 
      xhr.params = generatePendingUser(false, false, false, false); 

      var cb = sinon.spy(); 

      PendingUserController.create(xhr, { 
       'cb': cb 
      }); 
      assert.ok(cb.called); 
     }); 
    }); 
} 

function generatePendingUser(hasName, hasEmail, hasAffiliation, hasTitle) { 
    var pendingUser = {}; 

    if (hasName) pendingUser.name = 'Bobbie Brown'; 
    if (hasEmail) pendingUser.emailAddress = '[email protected]'; 
    if (hasAffiliation) pendingUser.affiliation = 'Very Exclusive University'; 
    if (hasTitle) pendingUser.title = "Assistant Professor"; 

    return pendingUser; 
} 

Mein Test wegen der snag unvollständig ist noch ich getroffen haben:

module.exports = { 

    create: function(req, res, next) { 

     var name, 
      invitee = req.allParams(); 

     if (_.isEmpty(invitee) || invitee.name === undefined) { 
      return res.badRequest('Invalid parameters provided when trying to create a new pending user.'); 
     } 

     // Parse the name into its parts. 
     name = invitee.name.split(' '); 
     delete invitee.name; 
     invitee.firstName = name[0]; 
     invitee.lastName = name[1]; 

     // Create the pending user and send response. 
     PendingUser.create(invitee, function(err, pending) { 
      var link; 

      if (err && err.code === 'E_VALIDATION') { 
       req.session.flash = { 'err': err }; 
       return res.status(400).send({'err':err}); 
      } 

      // Generate token & link 
      link = 'http://' + req.headers.host + '/join/' + pending.id; 

      // Respond with link. 
      res.json({'joinLink': link}); 
     }); 

    } 

} 

Der Test, den ich für diese Methode geschrieben haben, sieht wie folgt aus. Wie Sie aus dem Test sehen können, habe ich versucht, das Anfrageobjekt sowie die erste Methode, die in der Controller-Aktion req.allParams() aufgerufen wird, zu verspotten. Aber die zweite Methode, die möglicherweise in der Steuerung aufgerufen wird, ist res.badRequest(), die eine function built into the res object within sails.js ist.

Diese Funktion Ich weiß nicht, wie man mockt. Darüber hinaus wirft das Nachdenken über diese Funktion alle möglichen anderen Fragen auf. Warum verspotte ich diese Funktion überhaupt? Die Logik der Komponententests ist, denke ich, dass Sie Teile Ihres Codes isoliert mit anderen testen, aber geht das nicht ein bisschen weit? Es erzeugt auch eine Menge zusätzlicher Arbeit, weil ich das Verhalten dieser Funktion simulieren müsste, was einfach oder nicht einfach zu bewerkstelligen ist.

Der Code, den ich hier auf ein paar Proof-of-Concept-Art-Tutorials basiert geschrieben haben (siehe here, here und here), aber diese Stellen nicht mit dem Problem umgehen, in dem Sie Methoden auf die haben req und/oder res Objekte in der Steuerung.

Was ist der richtige Weg, um hier eine Lösung zu erreichen? Jeder Einblick würde sehr geschätzt werden!

Antwort

3

Sie versuchen, eine Erstellungsaktion auf dem ausstehenden Benutzercontroller zu testen und ihre Antwort/das Verhalten zu bestätigen. Was Sie tun können, ist eine Anfrage mit Supertest, um es zu testen.

Ich nehme an, Sie haben bereits bootstrapped your test mit Mocha & should.js.

var request = require('supertest'); 

describe('PendingUsersController', function() { 

    describe('#create()', function() { 
    it('should create a pending user', function (done) { 
     request(sails.hooks.http.app) 
     .post('/pendinguser') 
     //User Data 
     .send({ name: 'test', emailAdress: '[email protected]', affiliation: 'University of JavaScript', title: 'Software Engineer' }) 
     .expect(200) 
     .end(function (err, res) { 
       //true if response contains { message : "Your are pending user."} 
       res.body.message.should.be.eql("Your are pending user."); 
     }); 
     }); 
    }); 
}); 

Mehr auf Controller-Tests Sails.js from docs oder mehr bei this example Projekt suchen.

Verwandte Themen