Ответ 1
UPDATE
Размышляя о архитектуре приложения, мне было не так много, что мне нужно было проверить запрос/ответ контроллера Sails.js - в контексте этого приложения контроллеры очень глупы, поскольку они просто проходят через объекты JSON. Итак, что мне действительно нужно было проверить, так это то, что моя служба переводила внешний объект API в мое внутреннее DTO приложения, которое будет использоваться как возвращение JSON. Другими словами, для меня важнее проверить фактический перевод и обеспечить его контроль, который мы можем смело предположить, всегда будет иметь место.
Сказав это, я переключил свой блок тестирования модулей от Jasmine до Chad, предложив комбинацию Mocha, Chai и Sinon. Асинхронные крючки выглядят намного чище в Mocha, imo. Одна добавленная библиотека, которую я использовал, была Nock, библиотека, предназначенная для издевательства HTTP-запросов, чтобы я мог перехватить вызов моего класса сервиса API и вернуть заштрихованный объект.
Итак, чтобы повторить, я удалил блок тестирования контроллера, так как он лишний для моего использования. Важной функциональностью, которую мне нужно было проверить, был перевод внешнего объекта API на мое внутреннее приложение, эквивалентное DTO.
Unit test ниже для фактического обслуживания. Обратите внимание, что в этом конкретном тесте не было необходимости в Sinon для stubbing/mocking, поскольку Nock позаботился об этом для меня:
var Sails = require('sails');
var sinon = require('sinon'); // Mocking/stubbing/spying
var assert = require('chai').assert; // Assertions
var nock = require('nock'); // HTTP Request Mocking
var constants = require('../constants/externalSystemsConstants');
var Battlefield4Service = require('./battlefield4Service');
describe('External Services', function () {
// create a variable to hold the instantiated sails server
var app, battlefield4Service;
// Global before hook
before(function (done) {
// Lift Sails and start the server
Sails.lift({
log: {
level: 'error'
}
}, function (err, sails) {
app = sails;
done(err, sails);
});
});
// Global after hook
after(function (done) {
app.lower(done);
});
describe('Battlefield 4 Service', function () {
var userName, platform, kills, skill, deaths, killAssists, shotsHit, shotsFired;
before(function () {
// Mock data points
userName = 'dummyUser';
platform = 'ps3';
kills = 200;
skill = 300;
deaths = 220;
killAssists = 300;
shotsHit = 2346;
shotsFired = 7800;
var mockReturnJson = {
player: {
name: userName,
plat: platform
},
stats: {
kills: kills,
skill: skill,
deaths: deaths,
killAssists: killAssists,
shotsHit: shotsHit,
shotsFired: shotsFired
}
};
// Mock response from BF4 API
battlefield4Service = nock('http://' + constants.BF4_SERVICE_URI_HOST)
.get(constants.BF4_SERVICE_URI_PATH.replace('[platform]', platform).replace('[name]', userName))
.reply(200, mockReturnJson);
});
it('Should translate BF4 API data to FPSStatsDTO', function (done) {
var service = new Battlefield4Service();
service.getPlayerInfo(userName, platform, function (fpsStats) {
assert(fpsStats !== null);
assert(fpsStats !== undefined);
assert(fpsStats.kills === kills, 'kills');
assert(fpsStats.deaths === deaths, 'deaths');
assert(fpsStats.killAssists === killAssists, 'deaths')
assert(fpsStats.kdr === kills / deaths, 'kdr');
assert(fpsStats.shotsFired === shotsFired, 'shotsFired');
assert(fpsStats.shotsHit === shotsHit, 'shotsHit');
assert(fpsStats.shotsAccuracy === shotsHit / shotsFired, 'shotsAccuracy');
assert(fpsStats.userName === userName, 'userName');
assert(fpsStats.platform === platform, 'platform');
done();
});
});
});
});