В общем случае для модульного тестирования ASP.NET вместо доступа к HttpContext.Current у вас должно быть свойство типа HttpContextBase, значение которого задается путем внедрения зависимости (например, в ответе, предоставленном Womp).
Однако для тестирования функций, связанных с безопасностью, я бы рекомендовал использовать Thread.CurrentThread.Principal (вместо HttpContext.Current.User). Использование Thread.CurrentThread также имеет преимущество, заключающееся в возможности повторного использования вне веб-контекста (и работает одинаково в веб-контексте, поскольку платформа ASP.NET всегда устанавливает оба значения одинаково).
Чтобы затем протестировать Thread.CurrentThread.Principal, я обычно использую класс области видимости, который устанавливает Thread.CurrentThread в тестовое значение, а затем сбрасывает при утилизации:
using (new UserResetScope("LOONEYTUNES\BUGSBUNNY")) {
// Put test here -- CurrentThread.Principal is reset when PrincipalScope is disposed
}
Это хорошо согласуется со стандартным компонентом безопасности .NET, где у компонента есть известный интерфейс (IPrincipal) и местоположение (Thread.CurrentThread.Principal), и будет работать с любым кодом, который правильно использует / проверяет поток. CurrentThread.Principal.
Базовый класс области видимости будет выглядеть примерно так (при необходимости измените его, например, добавив роли):
class UserResetScope : IDisposable {
private IPrincipal originalUser;
public UserResetScope(string newUserName) {
originalUser = Thread.CurrentPrincipal;
var newUser = new GenericPrincipal(new GenericIdentity(newUserName), new string[0]);
Thread.CurrentPrincipal = newUser;
}
public IPrincipal OriginalUser { get { return this.originalUser; } }
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
Thread.CurrentPrincipal = originalUser;
}
}
}
Другой альтернативой является то, что вместо использования стандартного местоположения компонента безопасности напишите ваше приложение, чтобы использовать введенные данные безопасности, например, добавить свойство ISecurityContext с помощью метода GetCurrentUser () или аналогичного, а затем использовать его последовательно во всем приложении - но если вы собираетесь делать это в контексте веб-приложения, то вы также можете использовать предварительно созданный внедренный контекст , HttpContextBase.