Работал с Sails.js, и у него возникли проблемы с установкой модулей Jasmine для контроллера. Если это что-то очевидное, прошу простить мое невежество, поскольку я занимаюсь разработкой JavaScript уже 3-4 месяца.
В прошлых рамках (в частности, ASP.Net MVC) у нас были библиотеки для извлечения любых зависимостей, которые контроллер мог бы иметь, скажем, из внешней службы (через инъекцию зависимостей). Я хотел бы достичь того же уровня модульности с Sails.js, чтобы мы достигли правильного "единичного" теста. В частности, для моего случая у меня есть действие контроллера с зависимостью от объекта службы - я просто хочу высмеять ответ этой службы.
Тем не менее, мне нужно потратить время на запуск этого Jasmine unit test (используя плагин jasmine- node). Мой код ниже для контроллера и его unit test. То, что я получаю сейчас, это:
- Объект приложение, похоже, не разрешает в afterEach()
- Утверждения о шпионах и переменных уровня теста не выполняются.
Есть ли что-то явно очевидное, что я явно пропустил в своем unit test? Код ниже. Спасибо за любой вклад!
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);
});
});