如何在asp net core中模拟Session对象

Sru*_*ana 3 c# unit-testing moq asp.net-core asp.net-core-mvc-2.0

我正在使用moq框架编写单元测试.我在基本控制器中调用一个方法setsession()来设置会话使用SetString("userdata",object),我还有一个方法getsession()可以获得会话.

var sessionMock = new Mock<ISession>();
sessionMock.Setup(s => s.GetString("userdata")).Returns(Object);--failing
sessionMock.Setup(s => s.SetString("userdata",object));--failing
Run Code Online (Sandbox Code Playgroud)

我得到的错误s.GetStrings.SetString.

作为GetStringSetString是扩展方法可能是我需要使用另一种方式来处理它.

你能帮我么?

Nko*_*osi 8

根据ISession Extensions源代码 GetString并且SetString是扩展方法

public static void SetString(this ISession session, string key, string value)
{
    session.Set(key, Encoding.UTF8.GetBytes(value));
}

public static string GetString(this ISession session, string key)
{
    var data = session.Get(key);
    if (data == null)
    {
        return null;
    }
    return Encoding.UTF8.GetString(data);
}

public static byte[] Get(this ISession session, string key)
{
    byte[] value = null;
    session.TryGetValue(key, out value);
    return value;
}
Run Code Online (Sandbox Code Playgroud)

您将需要模拟ISession.Set并使ISession.TryGetValue扩展方法按预期执行.

//Arrange
var sessionMock = new Mock<ISession>();
var key = "userdata";
var value = new byte[0];

sessionMock.Setup(_ => _.Set(key, It.IsAny<byte[]>()))
    .Callback<string, byte[]>((k,v) => value = v);

sessionMock.Setup(_ => _.TryGetValue(key, out value))
    .Returns(true);
Run Code Online (Sandbox Code Playgroud)