2016-01-23 3 views
0

Я издеваюсь над HTTPContext в некоторых методах тестирования. У меня есть много методов, которые мне нужно написать, поэтому я бы предпочел повторно использовать код, чем писать каждый раз. Оставайтесь СУХОЙ.Как отключить код модуля тестирования в «Код для повторного использования»?

Я реализую this method of Faking (Mocking) HTTPContext. Я прочитал, что мне нужно разорвать это на Factory, чтобы повторно использовать его в других модульных тестах.

Вопрос: Как я могу поместить этот код в Factory для повторного использования его в Unit-Tests? Есть ли лучший способ, чтобы «фабрика» повторно использовала это? Как я могу это реализовать.


Код проверки

public class MyController : Controller 
{ 

    [HttpPost] 
    public void Index() 
    { 
     Response.Write("This is fiddly"); 
     Response.Flush(); 
    } 
} 

//Unit Test 

[Fact] 

public void Should_contain_fiddly_in_response() 
{ 

    var sb = new StringBuilder(); 

    var formCollection = new NameValueCollection(); 
    formCollection.Add("MyPostedData", "Boo"); 

    var request = A.Fake<HttpRequestBase>(); 
    A.CallTo(() => request.HttpMethod).Returns("POST"); 
    A.CallTo(() => request.Headers).Returns(new NameValueCollection()); 
    A.CallTo(() => request.Form).Returns(formCollection); 
    A.CallTo(() => request.QueryString).Returns(new NameValueCollection()); 

    var response = A.Fake<HttpResponseBase>(); 
    A.CallTo(() => response.Write(A<string>.Ignored)).Invokes((string x) => sb.Append(x)); 

    var mockHttpContext = A.Fake<HttpContextBase>(); 
    A.CallTo(() => mockHttpContext.Request).Returns(request); 
    A.CallTo(() => mockHttpContext.Response).Returns(response); 

    var controllerContext = new ControllerContext(mockHttpContext, new RouteData(), A.Fake<ControllerBase>()); 

    var myController = GetController(); 
    myController.ControllerContext = controllerContext; 


    myController.Index(); 

    Assert.Contains("fiddly", sb.ToString()); 
} 

ответ

1

Это зависит от ваших потребностей.
Возможно, этого достаточно, чтобы создать класс, который создаст вам фальшивые экземпляры контекста. Возможно, с некоторыми методами, которые позволяют создавать контексты, заполненные разными данными.

public class FakeContextFactory 
{ 
    public ControllerContext Create() {/*your mocking code*/} 

    public ControllerContext Create(NameValueCollection formVariables) {...} 

    ... 
} 

public void Test() 
{ 
    var context = new FakeContextFactory().Create(); 
    ... 
} 

В некоторых случаях это может быть статический завод, представленный классом статическими методами.

Если вам нужно много разных контекстов, возможно, лучше использовать шаблон строителя.

public void Test() 
{ 
    var context = FakeContextBuilder.New() 
         .SetRequestMethod("POST") 
         .Build(); 
    ... 
}