У меня есть свой веб-проект в .NET Core
2.x.В контроллере входа после входа в систему я сохраняю токен в Session
, чтобы этот токен проходил по страницам.
Моя проблема началась, когда я захотел протестировать все контроллеры.Если я вызываю контроллер из теста, HttpContext.Session
- это null
.
Затем я нашел это Mock
для сеанса
public class MockHttpSession : ISession
{
Dictionary<string, object> sessionStorage = new Dictionary<string, object>();
public object this[string name]
{
get { return sessionStorage[name]; }
set { sessionStorage[name] = value; }
}
string ISession.Id
{
get {
throw new NotImplementedException();
}
}
bool ISession.IsAvailable
{
get {
throw new NotImplementedException();
}
}
IEnumerable<string> ISession.Keys
{
get { return sessionStorage.Keys; }
}
void ISession.Clear()
{
sessionStorage.Clear();
}
Task ISession.CommitAsync(CancellationToken cancellationToken
= default(CancellationToken))
{
throw new NotImplementedException();
}
Task ISession.LoadAsync(CancellationToken cancellationToken
= default(CancellationToken))
{
throw new NotImplementedException();
}
void ISession.Remove(string key)
{
sessionStorage.Remove(key);
}
void ISession.Set(string key, byte[] value)
{
sessionStorage[key] = value;
}
bool ISession.TryGetValue(string key, out byte[] value)
{
if (sessionStorage[key] != null)
{
value = Encoding.ASCII.GetBytes(sessionStorage[key].ToString());
return true;
}
else
{
value = null;
return false;
}
}
}
Теперь я могу получить доступ к сеансу, нодля каждого ключа мне нужно прочитать его значение, например
var sessionName = new Byte[20];
bool nameOK = HttpContext.Session.TryGetValue("name", out sessionName);
if (nameOK)
string result = System.Text.Encoding.UTF8.GetString(sessionName);
Есть ли еще один простой способ сохранить некоторые значения для сеанса между контроллерами и тестируемым?
Обновление
Как видите, с моими фиктивными значениями в сеансе, но GetString
возвращает System.Byte[]
вместо значения.