Новый год же, все советуют не думать о работе, праздновать :) Ну так у меня все готово, все закуплено -- подарки, продукты. Да и празднование началось -- вчера корпоратив был :) Так что можно и подумать о работе немного. Тем более, что я "случайно" оказался в офисе. И тем более, что вообще-то сегодня обычный рабочий день.
Ну не совсем обычный. И я позволил себе вольность написать этот пост в рабочее время.
Возникло желание покрыть тестами асинхронный фукнционал -- взаимодействие FMS сервера с РНР хендлерами. По правилам тут нужны заглушки. Но поскольку я сам себе хозяин и никто мне не указ, то я решил сделать именно асинхронные тесты с реальными хендлерами. Получилось как-то так:
testHolder.TestChatLogin = function()
{
var client = new MockClient();
G.ClientMixer.Init(client);
var res = true;
var responder = {};
responder.res = true;
responder.client = client;
responder.LoginResult = function(data)
{
var res = this.res;
var client = this.client;
client.LoginResult(data);
res = AssertTrue(client.user != null, 'client.user must be not null') && res;
res = AssertTrue(client.user.id == '1', 'invalid client.user.id') && res;
res = AssertTrue(client.user.name == 'David', 'invalid client.user.name') && res;
res = AssertTrue(client.user.gender == 0, 'invalid client.user.gender') && res;
res = AssertTrue(client.user.level == 1, 'invalid client.user.level') && res;
res = AssertTrue(client.lastCallMethod == 'LoginResult', 'invalid lastCallMethod') && res;
res = AssertTrue(client.lastCallData != null, 'invalid lastCallData') && res;
res = AssertTrue(client.lastCallData.id == '1', 'invalid lastCallData.id') && res;
res = AssertTrue(client.lastCallData.name == 'David', 'invalid lastCallData.name') && res;
if(!res)
{
Core.Error('Async test "TestChatLogin" fails');
trace(data);
}
}
var query = new HttpQuery(G.SettingsManager.Get('loginHandler'), responder, 'LoginResult');
query.Send('chatLogin', {login:'david', password:'test'});
return res;
}
И оно-таки работает, как мне хотелось. Вместе с кодом FMS, заодно и РНР-хендлер тестируется. Но есть один побочный эффект -- провалившийся тест в консоли выглядит так:
... = run task [test/testSettings.asc] == run test [TestSettings] === test results: === total: 28 passed: 28 failed: 0 ~ invalid client.user.id ~ invalid client.user.name ~ invalid client.user.level ~ invalid lastCallData.id ~ invalid lastCallData.name ^ ERROR ^ Async test "TestChatLogin" fails <invalid_request />
То есть, все тесты прошли, статистика выведена в консоль, что все ок. И уже после этого срабатывает асинхронный обработчик и обнаруживает ошибки. Не очень красиво, ну и хрен с ним. Главное -- ошибки все-таки видны.
З новым годам, родны край! Ну и другие края тоже :)
UPDATE: нашел ошибку в РНР хендлере таким образом, которой не заметил, когда тестил эти хендлеры через браузер. И, оказывается, такие тесты тоже бывают, только они называются интеграционные, а не юнит-тесты.
Add new comment