Как правило, для модульного тестирования 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), и будет работать с любым кодом, который правильно использует / проверяет Thread.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.
person
Sly Gryphon
schedule
30.01.2012