Размер шрифта
-
+

Как тестируют в Google - стр. 46

AddUrlFrontend& operator=(const AddUrlFrontend& rhs);

 };

#endif// ADDURL_ADDURL_FRONTEND_H_

Продолжая определять классы AddUrlFrontend, разработчик создает файл addurl_frontend.cc, в котором описывает класс AddUrlFrontend. Для экономии места мы опустили часть файла.

File: depot/addurl/addurl_frontend.cc

#include "addurl/addurl_frontend.h"

#include "addurl/addurl.pb.h"

#include "path/to/httpqueryparams.h"


// Functions used by HandleAddUrlFrontendRequest() below, but

// whose definitions are omitted for brevity.


void ExtractHttpQueryParams(const HTTPRequest* http_request,

HTTPQueryParams* query_params);

void WriteHttp200Reply(HTTPReply* reply);


void WriteHttpReplyWithErrorDetails(

HTTPReply* http_reply, const AddUrlReply& add_url_reply);


// AddUrlFrontend constructor that injects the AddUrlService

// dependency.


AddUrlFrontend::AddUrlFrontend(AddUrlService* add_url_service)

: add_url_service_(add_url_service) {

}


// AddUrlFrontend destructor – there's nothing to do here.

AddUrlFrontend::~AddUrlFrontend() {

}

// HandleAddUrlFrontendRequest:

// Handles requests to /addurl by parsing the request,

// dispatching a backend request to an AddUrlService backend,

// and transforming the backend reply into an appropriate

// HTTP reply.

//

// Args:

// http_request – The raw HTTP request received by the server.

// http_reply – The raw HTTP reply to send in response.


void AddUrlFrontend::HandleAddUrlFrontendRequest(

const HTTPRequest* http_request, HTTPReply* http_reply) {


 // Extract the query parameters from the raw HTTP request.


 HTTPQueryParams query_params;

 ExtractHttpQueryParams(http_request, &query_params);


 // Get the 'url' and 'comment' query components.

 // Default each to an empty string if they were not present

 // in http_request.


 string url =

query_params.GetQueryComponentDefault("url", "");

string comment =

query_params.GetQueryComponentDefault("comment", "");


// Prepare the request to the AddUrlService backend.


AddUrlRequest add_url_request;

AddUrlReply add_url_reply;

add_url_request.set_url(url);


if (!comment.empty()) {

 add_url_request.set_comment(comment);

}


// Issue the request to the AddUrlService backend.


RPC rpc;

add_url_service_->AddUrl(

&rpc, &add_url_request, &add_url_reply);


// Block until the reply is received from the

// AddUrlService backend.


rpc.Wait();


// Handle errors, if any:


if (add_url_reply.has_error_code()) {

 WriteHttpReplyWithErrorDetails(http_reply, add_url_reply);

} else {


 // No errors. Send HTTP 200 OK response to client.


 WriteHttp200Reply(http_reply);

}

}

На функцию HandleAddUrlFrontendRequest ложится большая нагрузка – так устроены многие веб-обработчики. Разработчик может разгрузить эту функцию, выделив часть ее функциональности вспомогательным функциям. Но такой рефакторинг обычно не проводят, пока сборка не станет стабильной, а написанные юнит-тесты не будут успешно проходить.

Страница 46