SailsJS: Como controlar adequadamente os controladores de teste?

Estava trabalhando com o Sails.js e estava tendo problemas para apresentar os testes de unidade Jasmine para um controlador. Se isso é algo óbvio, perdoe minha ignorância, pois só tenho mergulhado profundamente no desenvolvimento de JavaScript nos últimos 3-4 meses.

Em estruturas anteriores (especificamente ASP .Net MVC), tínhamos bibliotecas para zombar de quaisquer dependências que um controlador possa precisar para, por exemplo, um serviço externo (via injeção de dependência). Eu meio que queria alcançar o mesmo nível de testabilidade unitária com o Sails.js, para que possamos obter um teste "unitário" adequado. Especificamente, no meu caso, eu tenho uma ação de controlador com dependência de um objeto de serviço - eu simplesmente quero zombar da resposta desse serviço.

No entanto, estou tendo um bom tempo para executar este teste de unidade Jasmine (usando o plugin jasmine-node). Meu código está abaixo para o controlador e seu teste de unidade. O que estou recebendo agora é:

oaplicativo O objeto não parece resolver em afterEach ()As afirmações sobre os espiões e as variáveis em nível de teste estão falhando.

Existe algo óbvio que eu claramente perdi no meu teste de unidade? Código abaixo. Obrigado por qualquer contribuição!

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);
    });
});

questionAnswers(2)

yourAnswerToTheQuestion