SailsJS: Wie man Prüflinge richtig einbaut?

Ich habe mit Sails.js zusammengearbeitet und Probleme mit der Erstellung von Jasmine-Komponententests für einen Controller. Wenn dies offensichtlich ist, entschuldigen Sie bitte meine Unwissenheit, da ich mich in den letzten 3-4 Monaten nur intensiv mit der JavaScript-Entwicklung befasst habe.

In früheren Frameworks (insbesondere ASP .Net MVC) hatten wir Bibliotheken, um alle Abhängigkeiten auszublenden, die ein Controller beispielsweise für einen externen Dienst haben musste (über Abhängigkeitsinjektion). Ich wollte mit Sails.js ein gleiches Maß an Testbarkeit der Einheiten erreichen, damit wir einen ordnungsgemäßen "Einheitentest" erreichen. Speziell für meinen Fall habe ich eine Controller-Aktion mit einer Abhängigkeit von einem Dienstobjekt - ich möchte einfach die Antwort dieses Dienstes verspotten.

Allerdings habe ich verdammt viel Zeit damit, diesen Jasmine-Unit-Test (mit dem Jasmine-Node-Plugin) zum Laufen zu bringen. Mein Code ist unten für den Controller und seinen Unit-Test. Was ich gerade bekomme ist:

DasApp Objekt scheint sich in afterEach () nicht aufzulösenDie Aussagen über die Spione und die Variablen auf Testebene schlagen fehl.

Gibt es etwas offensichtliches, das ich in meinem Unit-Test deutlich verpasst habe? Code unten. Vielen Dank für jede Eingabe!

UserController.js

var Battlefield4Service = require('../services/battlefield4Service');
module.exports = {
    /**
     * /user/bf4stats
     */
    bf4Stats: function (req, res) {
        var userName = req.param('userName');
        var platform = req.param('platform');
        var service = new Battlefield4Service();
        service.getPlayerInfo(userName, platform,
            function (data) {
                // Success callback
                res.json(data);
            });
    }
};

UserController.spec.js

var Sails = require('sails');
var userController = require('./UserController');
var FPSStatsDTO = require('../dto/fpsStatsDTO');

describe('UserController', function() {

    // create a variable to hold the instantiated sails server
    var app, req, res, rawObject, json;

    // Setup mocked dependencies
    beforeEach(function() {

        // Lift Sails and start the server
        Sails.lift({
            log: {
                level: 'error'
            }
        }, function(err, sails) {
            app = sails;
            //done(err, sails);
        });

        // Mocked Battlefield4Service
        Battlefield4Service = {
            getPlayerInfo:  function (userName, platform, success) {
                var dto = new FPSStatsDTO();
                dto.userName = userName;
                dto.platform = platform;
                success(dto);
            }
        };

        // req and res objects, mock out the json call
        req = {
            param: function(paramName) {
                switch (paramName) {
                    case 'userName':
                        return 'dummyUser';
                    case 'platform':
                        return 'dummyPlatform';
                }
            }
        };
        res = {
            json: function(object) {
                rawObject = object;
                json = JSON.stringify(object);
                return json;
            }
        };

        // Deploy 007
        spyOn(req, 'param');
        spyOn(res, 'json');
        spyOn(Battlefield4Service, 'getPlayerInfo');
    });

    afterEach(function(){
        app.lower();
    });

    it('Should call the Battlefield 4 Service', function() {

        // Call the controller
        userController.bf4Stats(req, res);

        // Assertions
        expect(req.param).toHaveBeenCalled();
        expect(res.json).toHaveBeenCalled();
        expect(Battlefield4Service.getPlayerInfo).toHaveBeenCalledWith(req.param('userName'), req.param('platform'));
        expect(rawObject.userName).toEqual(req.param('userName'));
        expect(rawObject.platform).toEqual(req.param('platform'));
        expect(json).toNotBe(null);
        expect(json).toNotBe(undefined);
    });
});

Antworten auf die Frage(2)

Ihre Antwort auf die Frage