как издеваться над HTTP-контекстом с помощью Moq

У моей компании есть собственный SDK, который содержит следующий класс:

public class SharePointContext(System.Web.HttpContext context)
{

}

Как я могу использовать Moq, чтобы издеваться над HttpContext, который будет передан в качестве аргумента? Образец из Интернета с использованием HttpContextBase и, очевидно, выдаст ошибку, поскольку вы не можете назначить конкретный класс абстрактному классу.

Любые идеи?


person user384080    schedule 17.05.2012    source источник


Ответы (1)


Для последнего Moq должно работать что-то вроде этого. Кажется, что для Moq требуется абстрактный класс или интерфейс или, по крайней мере, класс, который не запечатан. Все это затрудняет издевательство над HttpContext.

//class that returns all the mock objects you need..
public static class MockHelpers
{
   public static HttpContextBase GetFakeContext()
   {
       var context = new Mock<HttpContextBase>();
       //we need these for our context 
       var request = new Mock<HttpRequestBase>();
       var response = new Mock<HttpResponseBase>();
       var session = new Mock<HttpSessionStateBase>();
       var server = new Mock<HttpServerUtilityBase>();


       context.Setup(ct => ct.Request).Returns(request.Object);
       context.Setup(ct => ct.Response).Returns(response.Object);
       context.Setup(ct => ct.Session).Returns(session.Object);
       context.Setup(ct => ct.Server).Returns(server.Object);

       return context.Object;
   }
}

Затем вы используете его следующим образом:

public class SharePointContext(MockHelpers.GetFakeContext());
person gideon    schedule 17.05.2012
comment
приятель .. как я уже сказал, я пробовал тот же подход, что и вы. он жалуется, что не может назначить HttpContextBase для HttpContext - person user384080; 17.05.2012
comment
@gideon .. HttpContext - это конкретный класс. вы не можете издеваться над конкретным классом. вы можете только издеваться над абстрактными или интерфейсными классами. - person user384080; 18.05.2012
comment
@user384080 user384080 да, ты прав, я не понимал. Если это ваш код, вы, вероятно, могли бы его изменить. Хотя может у тебя опечатка? :public **class** SharePointContext(System.Web.HttpContext context) Это метод. - person gideon; 18.05.2012
comment
Внедрение HttpContext не очень полезно, поскольку вы не можете издеваться над HttpContext без платы, такой как TypeMock. Как и @gideon, вы должны внедрить HttpContextBase, который является макетом, и использовать HttpContextWrapper, когда вам нужно использовать настоящий HttpContext. Подробнее об этом можно прочитать здесь, например http://splinter.com.au/httpcontext-vs-httpcontextbase-vs-httpcontext - person simoraman; 18.05.2012