Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Виртуальные методы только для тестирования 
:(
    Опции темы
qwertylolman
Дата 23.2.2012, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.5.2010

Репутация: нет
Всего: нет



вопрос к гуру модульного тестирования. c#, nUnit, rhino mocks. есть класс, класс инкапсулирует отправку запроса на удаленный сервис, получает ответ, обрабатывает его, парсит json. надо покрыть тестом этот класс. класс:
Код
public class HTTPVerbGet<TRestHttpResponse> : BaseHttpVerb<TRestHttpResponse>
        where TRestHttpResponse : RestHttpEmptyResponse
    {
        private readonly IRestHttpResponseBuilder<TRestHttpResponse> _restHttpResponseBuilder;
        private readonly IWebRequestWrapper _webRequestWrapper;

        public HTTPVerbGet(string restServicesUrl, string restServiceName, string appToken,
            IQueryStringBuilder queryStringBuilder,
            IRestHttpResponseBuilder<TRestHttpResponse> restHttpResponseBuilder,
            IWebRequestWrapper webRequestWrapper)
            : base(restServicesUrl, restServiceName, appToken, queryStringBuilder)
        {
            if (null == restHttpResponseBuilder)
                throw new ArgumentNullException("restHttpResponseBuilder");

            if (null == webRequestWrapper)
                throw new ArgumentNullException("webRequestWrapper");

            _restHttpResponseBuilder = restHttpResponseBuilder;
            _webRequestWrapper = webRequestWrapper;
        }

        protected override TRestHttpResponse Execute(params UrlParameter[] urlParameters)
        {
            var urlParametersWithAppToken = new List<UrlParameter>(urlParameters)
                                                    {
                                                        new UrlParameter("appToken", AppToken)
                                                    };

            var webRequestParams = GetWebRequestParams(urlParametersWithAppToken.ToArray());

            var webResponse = _webRequestWrapper.GetResponse(webRequestParams);

            var stream = GetStreamFromResponse(webResponse);

            if (stream == null)
            {
                throw new HttpRestExecutionException(
                    string.Format("Can not get stream from the response from the REST service '{0}' ",
                                  FullRestSvcUrlWithoutParams));
            }

            using (stream)
            {
                return GetResponseFromStream(stream);
            }
        }

        protected virtual WebRequestParams GetWebRequestParams(IEnumerable<UrlParameter> urlParameters)
        {
            return new WebRequestParams(QueryStringBuilder, FullRestSvcUrlWithoutParams, urlParameters);
        }

        protected virtual Stream GetStreamFromResponse(WebResponse webResponse)
        {
            return webResponse.GetResponseStream();
        }

        protected virtual TRestHttpResponse GetResponseFromStream(Stream stream)
        {
            var streamReader = new StreamReader(stream);
            string jsonContent = streamReader.ReadToEnd();
            return _restHttpResponseBuilder.Build(jsonContent);
        }
    }


собсна вопрос: нормально ли делать методы protected virtual только ради покрытия юнит тестами?

и модульный тест для этого класса
Код
[TestFixture]
    public class HTTPVerbGetTests : HTTPVerbGet<RestHttpEmptyResponse>
    {
        public HTTPVerbGetTests(IQueryStringBuilder queryStringBuilder, IRestHttpResponseBuilder<RestHttpEmptyResponse> restHttpResponseBuilder, IWebRequestWrapper webRequestWrapper)
            : base(restServicesUrl, restServiceName, appToken, queryStringBuilder, restHttpResponseBuilder, webRequestWrapper)
        {
        }
        public HTTPVerbGetTests()
            : base(restServicesUrl, restServiceName, appToken, _queryStringBuilderMock, _restHttpResponseBuilderMock, _webRequestWrapperMock)
        {
        }

        private const string restServicesUrl = "restServicesUrl";
        private const string restServiceName = "restServiceName";
        private const string appToken = "appToken";
        private static readonly MockRepository _mocks = new MockRepository();
        private static readonly IQueryStringBuilder _queryStringBuilderMock = _mocks.DynamicMock<IQueryStringBuilder>();
        private static readonly IRestHttpResponseBuilder<RestHttpEmptyResponse> _restHttpResponseBuilderMock = _mocks.DynamicMock<IRestHttpResponseBuilder<RestHttpEmptyResponse>>();
        private static readonly IWebRequestWrapper _webRequestWrapperMock = _mocks.DynamicMock<IWebRequestWrapper>();

        [Test]
        public void TestThrowsExceptionOnNullArgumentsInConstructor()
        {
            Assert.Throws<ArgumentNullException>(
                () => new HTTPVerbGetTests(_queryStringBuilderMock, null, _webRequestWrapperMock));
            Assert.Throws<ArgumentNullException>(
                () => new HTTPVerbGetTests(_queryStringBuilderMock, _restHttpResponseBuilderMock, null));
        }

        [Test]
        public void TestCallGetWebRequestParams()
        {
            var mocks = new MockRepository();
            var queryStrBldMock = mocks.StrictMock<IQueryStringBuilder>();
            string fakeString = "fakseString";

            Expect
                .Call(queryStrBldMock.Build())
                .IgnoreArguments()
                .Repeat.Any()
                .Return(fakeString);

            mocks.Replay(queryStrBldMock);

            
            var webRequestWrapperMock = mocks.DynamicMock<IWebRequestWrapper>();
            var webRequestParams = new WebRequestParams(queryStrBldMock,
                                                        FullRestSvcUrlWithoutParams,
                                                        new List<UrlParameter>());
            Stream stream = new MemoryStream();
            WebResponse webResponseMock = mocks.DynamicMock<WebResponse>();
            var httpVerbGetMock =
                mocks.PartialMock<HTTPVerbGetTests>(new object[]
                                                        {
                                                            queryStrBldMock,
                                                            _restHttpResponseBuilderMock, 
                                                            webRequestWrapperMock
                                                        });
            
            With
                .Mocks(mocks)
                .Expecting(() =>
                               {
                                   Expect
                                       .Call(httpVerbGetMock.GetWebRequestParams(null))
                                       .IgnoreArguments()
                                       .Return(webRequestParams);
                                   Expect
                                       .Call(webRequestWrapperMock.GetResponse(webRequestParams))
                                       .Return(webResponseMock);
                                   Expect
                                       .Call(httpVerbGetMock.GetStreamFromResponse(webResponseMock))
                                       .Return(stream);
                                   Expect
                                       .Call(httpVerbGetMock.GetResponseFromStream(stream))
                                       .Return(null);
                               })
                .Verify(() => httpVerbGetMock.Execute());
        }

        [Test]
        public void TestCallGetWebRequestParamsThrowsAnExceptionOnEmptyStream()
        {
            var mocks = new MockRepository();
            var queryStrBldMock = mocks.StrictMock<IQueryStringBuilder>();
            string fakeString = "fakseString";

            Expect
                .Call(queryStrBldMock.Build())
                .IgnoreArguments()
                .Repeat.Any()
                .Return(fakeString);

            mocks.Replay(queryStrBldMock);


            var webRequestWrapperMock = mocks.DynamicMock<IWebRequestWrapper>();
            var webRequestParams = new WebRequestParams(queryStrBldMock,
                                                        FullRestSvcUrlWithoutParams,
                                                        new List<UrlParameter>());
            WebResponse webResponseMock = mocks.DynamicMock<WebResponse>();
            var httpVerbGetMock =
                mocks.PartialMock<HTTPVerbGetTests>(new object[]
                                                        {
                                                            queryStrBldMock,
                                                            _restHttpResponseBuilderMock, 
                                                            webRequestWrapperMock
                                                        });

            With
                .Mocks(mocks)
                .Expecting(() =>
                {
                    Expect
                        .Call(httpVerbGetMock.GetWebRequestParams(null))
                        .IgnoreArguments()
                        .Return(webRequestParams);
                    Expect
                        .Call(webRequestWrapperMock.GetResponse(webRequestParams))
                        .Return(webResponseMock);
                    Expect
                        .Call(httpVerbGetMock.GetStreamFromResponse(webResponseMock))
                        .Return(null);
                })
                .Verify(() => Assert.Throws<HttpRestExecutionException>(() => httpVerbGetMock.Execute()));
        }

        [Test]
        public void TestWithErrorInJson()
        {
            var mocks = new MockRepository();
            var queryStrBldMock = mocks.StrictMock<IQueryStringBuilder>();
            string fakeString = "fakseString";
            int errorCode = 1;
            string errorMessage = "Test of the exception or error";
            string jsonString = "{\"ErrorInfo\":{\"ErrorCode\":" + errorCode + ",\"ErrorMessage\":\"" + errorMessage + "\"}," +
                                "\"Result\":[{\"Id\":1111,\"SomeStr\":\"1111\"},{\"Id\":222,\"SomeStr\":\"22222\"}]}";

            Expect
                .Call(queryStrBldMock.Build())
                .IgnoreArguments()
                .Repeat.Any()
                .Return(fakeString);

            mocks.Replay(queryStrBldMock);


            var webRequestWrapperMock = mocks.DynamicMock<IWebRequestWrapper>();
            var webRequestParams = new WebRequestParams(queryStrBldMock,
                                                        FullRestSvcUrlWithoutParams,
                                                        new List<UrlParameter>());
            Stream stream = new MemoryStream(Encoding.Default.GetBytes(jsonString));
            WebResponse webResponseMock = mocks.DynamicMock<WebResponse>();
            var httpVerbGetMock =
                mocks.PartialMock<HTTPVerbGetTests>(new object[]
                                                        {
                                                            queryStrBldMock,
                                                            new RestHttpResponseBuilder<RestHttpEmptyResponse>(), 
                                                            webRequestWrapperMock
                                                        });

            With
                .Mocks(mocks)
                .Expecting(() =>
                {
                    Expect
                        .Call(httpVerbGetMock.GetWebRequestParams(null))
                        .IgnoreArguments()
                        .Return(webRequestParams);
                    Expect
                        .Call(webRequestWrapperMock.GetResponse(webRequestParams))
                        .Return(webResponseMock);
                    Expect
                        .Call(httpVerbGetMock.GetStreamFromResponse(webResponseMock))
                        .Return(stream);
                })
                .Verify(() =>
                            {
                                var result = httpVerbGetMock.Execute();
                                Assert.AreEqual(errorCode, (int)result.ErrorInfo.ErrorCode);
                                Assert.AreEqual(errorMessage, result.ErrorInfo.ErrorMessage);
                            });
        }
    }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1163 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.