FMS. Асинхронные юнит-тесты.

Новый год же, все советуют не думать о работе, праздновать :) Ну так у меня все готово, все закуплено -- подарки, продукты. Да и празднование началось -- вчера корпоратив был :) Так что можно и подумать о работе немного. Тем более, что я "случайно" оказался в офисе. И тем более, что вообще-то сегодня обычный рабочий день.

Ну не совсем обычный. И я позволил себе вольность написать этот пост в рабочее время.

Возникло желание покрыть тестами асинхронный фукнционал -- взаимодействие 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

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
question for bots )
Image CAPTCHA
Enter the characters shown in the image.