gpt4 book ai didi

c# - Asp.net 核心 session 单元测试

转载 作者:行者123 更新时间:2023-11-30 15:54:35 28 4
gpt4 key购买 nike

我对 asp.net core mvc Controller 进行单元测试时遇到问题!问题是在我的 Controller 中,我使用 session :

[HttpPost]
public IActionResult OpretLobby(LobbyViewModel lobby)
{
try
{
//find brugeren der har lavet lobby
var currentUser = HttpContext.Session.GetObjectFromJson<User>("user");
//save as a lobby
ILobby nyLobby = new Lobby(currentUser.Username)
{
Id = lobby.Id
};
SessionExtension.SetObjectAsJson(HttpContext.Session, lobby.Id, nyLobby);
//add to the list
_lobbyList.Add(nyLobby);
return RedirectToAction("Lobby","Lobby",lobby);
}

这一切都在服务器上在线运行良好,这里没有任何问题。但是当涉及到对整个事情进行单元测试的需求时,它就不再那么完美了。

基本上问题是,我无法通过测试访问我的 session 。我尝试了很多方法来创建模拟,但大多数解决方案都适用于 .net 框架,而不适用于 .net核心出于某种原因!请帮助我痛苦!

注意:

我使用了一个虚拟版本的测试来隔离这个问题:

[Test]
public void TestIsWorking()
{
SessionExtension.SetObjectAsJson(uut.HttpContext.Session, "user", _savedUser);
//ViewResult result = uut.OpretLobby(lobbyViewModel) as ViewResult;

//Assert.AreEqual("OpretLobby", result.ViewName);
Assert.AreEqual(1,1);
}

尝试为用户设置 session 时也出错了:/

最佳答案

GetObjectFromJson 似乎是一种扩展方法。如果是这样,我们就不能轻松模拟静态方法。

我通常为那种场景创建一个抽象。然后将其注册到DI容器中,并将依赖注入(inject)到 Controller 中。

启动.cs

public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
...
services.AddScoped<IUserSession, UserSession>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
...
}
...
}

抽象

public class User
{
public string Username { get; set; }
}

public interface IUserSession
{
User User { get; }
}

public class UserSession : IUserSession
{
private readonly IHttpContextAccessor _httpContextAccessor;

public UserSession(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}

public User User => _httpContextAccessor.HttpContext.Session.GetObjectFromJson<User>("user");
}

public static class SessionExtensions
{
public static User GetObjectFromJson<User>(
this ISession sesson, string json) where User : new()
{
return new User(); // Dummy extension method just to test OP's code
}
}

Controller

public class HomeController : Controller
{
private readonly IUserSession _userSession;

public HomeController(IUserSession userSession)
{
_userSession = userSession;
}

public IActionResult OpretLobby()
{
var currentUser = _userSession.User;
return View(currentUser);
}
}

单元测试

using AspNetCore.Controllers;
using Microsoft.AspNetCore.Mvc;
using Moq;
using Xunit;

namespace XUnitTestProject1
{
public class HomeControllerTests
{
private readonly User _user;

public HomeControllerTests()
{
_user = new User {Username = "johndoe"};
}

[Fact]
public void OpretLobby_Test()
{
// Arrange
var mockUserSession = new Mock<IUserSession>();
mockUserSession.Setup(x => x.User).Returns(_user);
var sut = new HomeController(mockUserSession.Object);

// Act
var result = sut.OpretLobby();

// Assert
var viewResult = Assert.IsType<ViewResult>(result);
var user = Assert.IsType<User>(viewResult.Model);
Assert.Equal(_user.Username, user.Username);
}
}
}

关于c# - Asp.net 核心 session 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50066893/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com