Новичок
Профиль
Группа: Участник
Сообщений: 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); }); } } |
|