c# - 如何模拟 ASP.NET 5 中的 UserManager

标签 c# unit-testing asp.net-core asp.net-core-mvc xunit.net

我正在编写用于在 ASP.NET 5 应用程序中管理用户的 UI。我需要在 UI 中显示 UserManager 返回的任何错误。我在 View 模型中传回了 IdentityResult 错误,但在测试我的代码时我有点随波逐流。

ASP.NET 5 中模拟 UserManager 的最佳方法是什么?

我是否应该继承 UserManager 并覆盖我正在使用的所有方法,然后将我的 UserManager 版本注入(inject)到 Controller 的实例中> 在我的测试项目中?

最佳答案

我在 MVC 音乐商店示例应用程序的帮助下管理了它。

在我的单元测试类中,我像这样设置数据库上下文和 UserManager:

public class DatabaseSetupTests : IDisposable
{
    private MyDbContext Context { get; }

    private UserManager<ApplicationUser> UserManager { get; }

    public DatabaseSetupTests()
    {
        var services = new ServiceCollection();
        services.AddEntityFramework()
            .AddInMemoryDatabase()
            .AddDbContext<MyDbContext>(options => options.UseInMemoryDatabase());
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<MyDbContext>();
        // Taken from https://github.com/aspnet/MusicStore/blob/dev/test/MusicStore.Test/ManageControllerTest.cs (and modified)
        // IHttpContextAccessor is required for SignInManager, and UserManager
        var context = new DefaultHttpContext();
        context.Features.Set<IHttpAuthenticationFeature>(new HttpAuthenticationFeature());
        services.AddSingleton<IHttpContextAccessor>(h => new HttpContextAccessor { HttpContext = context });
        var serviceProvider = services.BuildServiceProvider();
        Context = serviceProvider.GetRequiredService<MyDbContext>();
        UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
    }
....
}

然后我可以在我的单元测试中使用 UserManager,例如:

[Fact]
public async Task DontCreateAdminUserWhenOtherAdminsPresent()
{
    await UserManager.CreateAsync(new ApplicationUser { UserName = "some@user.com" }, "IDoComplyWithTheRules2016!");
    ...
}

如果您的依赖注入(inject)器无法解析 IHttpContextAccessor,那么您将无法创建 UserManager 实例,因为它依赖于它。 我认为(这只是一个假设),对于 Asp.Net 5,UserManager 确实会在您为用户更改基于 cookie 的声明(声​​明、角色...)时负责刷新它们,因此需要一些 HttpContext 进行登录/注销操作和 cookie 访问。

关于c# - 如何模拟 ASP.NET 5 中的 UserManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34384549/

相关文章:

c# - 如何处理 SQL 中随机字符串键的主键存在?

c# - 该属性是接口(interface)类型 ('IFormFile' ) MVC Core

docker - 尝试从 Docker 容器访问 Kubernetes API 的问题

c# - 更新数据库 n :n

c# - 如何使用 OpenXML 从 Excel 中删除行

c# - 当我提取一个元素时,c# List 的数组是否被移动?

c# - (MSTest) 扩展 ExpectedExceptionBaseAttribute 隐藏测试失败解释

angular - 类型 'TestHotObservable' 缺少类型 'Subject<any>' 中的以下属性 : observers, closed、isStopped、hasError 以及另外 5 个

java - 如何从使用 Google @Inject 的 Singleton 类调用非静态公共(public)方法

c# - 可以在 asp.net 4.6 中进行 Roslyn 自动编译吗?