Я пытаюсь издеваться над HttpContext, чтобы я мог выполнить модульное тестирование вызова Request.IsAuthenicated моего контроллера. Я использую блог код, который я нашел у Скотта Хансельмана для моделирования HttpContext с помощью rhino.mocks. Итак, у меня есть этот образец модульного теста:
PostsController postsController = new PostsController(postDL);
mocks.SetFakeControllerContext(postsController);
Expect.Call(postsController.Request.IsAuthenticated).Return(true);
В моем действии контроллера у меня есть что-то вроде
if (Request.IsAuthenticated)....
когда я пытаюсь запустить модульный тест, тест не генерирует нулевое исключение, а когда я пытаюсь отладить модульный тест, я вижу, что HttpContext никогда не назначается контроллеру.
есть идеи?





Теперь, для раскрытия, мне еще предстоит пачкать руки с большинством вещей, с которыми вы работаете, однако:
Если вы хотите издеваться над IsAuthenticated, почему бы просто не создать статический класс, чтобы возвращать bool, которым можно управлять с помощью вашего тестового кода?
Это немного грубовато, но, надеюсь, вы уловили идею:
interface IAuthenticationChecker
{
bool IsAuthenticated { get; }
}
public class MockAuthenticationChecker : IAuthenticationChecker
{
static bool _authenticated = false;
public static void SetAuthenticated(bool value)
{
_authenticated = value;
}
#region IAuthenticationChecker Members
public bool IsAuthenticated
{
get { return _authenticated; }
}
#endregion
}
public class RequestAuthenticationChecker : IAuthenticationChecker
{
#region IAuthenticationChecker Members
public bool IsAuthenticated
{
get {
if (HttpContext.Current == null)
throw new ApplicationException(
"Unable to Retrieve IsAuthenticated for Request becuse there is no current HttpContext.");
return HttpContext.Current.Request.IsAuthenticated;
}
}
#endregion
}
Затем вы можете использовать ссылку на любом уровне приложения, да, это означает, что вам нужно добавить ссылку на уровне приложения, и вам нужно использовать другую ссылку, а не Request, но вы также получаете полный контроль над аутентификацией для тестирования :)
К вашему сведению - это полностью открыто для разлета, я собрал его примерно за минуту :)
Это может быть полезно для вас, сработало для меня в аналогичном сценарии:
В комментариях есть ссылка, у меня работала: web.archive.org/web/20080731141201/http://haacked.com/code/…
Это должно работать:
PostsController postsController = new PostsController(postDL);
var context = mocks.Stub<HttpContextBase>();
var request = mocks.Stub<HttpRequestBase>();
SetupResult.For(request.IsAuthenticated).Return(true);
SetupResult.For(context.Request).Return(request);
postsController.ControllerContext = new ControllerContext(context, new RouteData(), postsController);
Вы можете найти сообщение, которое я написал об этом, как в некотором роде http://santoshbenjamin.wordpress.com/2008/08/04/mock-httpcontext-and-session-state/
ваше здоровье Бенджи
Вот один простой способ подделать контекст, найденный в Блог Джеффа:
TextWriter tw = new StringWriter();
HttpWorkerRequest wr = new SimpleWorkerRequest("/webapp", "c:\\inetpub\\wwwroot\\webapp\\", "default.aspx", "", tw);
HttpContext.Current = new HttpContext(wr);
Вот класс, который может быть полезен. Он обрабатывает запросы ajax, аутентификацию пользователей, параметры запроса и многое другое: https://gist.github.com/3004119
это метод грубой силы, когда у вас нет HttpContextBase и связанных абстрактных базовых классов