Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 单元测试标识DbContext_Asp.net_Entity Framework_Unit Testing_Asp.net Identity_Asp.net Core - Fatal编程技术网

Asp.net 单元测试标识DbContext

Asp.net 单元测试标识DbContext,asp.net,entity-framework,unit-testing,asp.net-identity,asp.net-core,Asp.net,Entity Framework,Unit Testing,Asp.net Identity,Asp.net Core,我读到新的EF7允许内存存储,这使得单元测试更容易。这在DbContext上非常有效,但到目前为止我遇到的问题是,我使用的是IdentityDbContext,它没有随该选项一起提供,或者我还没有找到它 我试图做的是将单元测试添加到AccountController中,这取决于新的UserManager和SignInManager类。我想针对内存中的列表进行测试,但我仍然不知道如何使这些类使用不同于EF-SQL IdentityDbContext的dbcontext。有什么办法可以解决这个问题吗

我读到新的EF7允许内存存储,这使得单元测试更容易。这在DbContext上非常有效,但到目前为止我遇到的问题是,我使用的是IdentityDbContext,它没有随该选项一起提供,或者我还没有找到它


我试图做的是将单元测试添加到AccountController中,这取决于新的UserManager和SignInManager类。我想针对内存中的列表进行测试,但我仍然不知道如何使这些类使用不同于EF-SQL IdentityDbContext的dbcontext。有什么办法可以解决这个问题吗?

最终,您可能希望直接模拟
用户管理器和
登录管理器。不幸的是,beta-3下的许多方法都不是虚拟的;你会被困在那里的。但是,您可以从和的来源看到,标识团队似乎正在为下一版本解决这些问题

由于同一问题,我个人有几个测试没有编译。

2015年12月27日-RC1更新 project.json

{
  "version": "1.0.0-*",
  "dependencies": {
    "{assembly under test}": "",
    "Microsoft.AspNet.Hosting": "1.0.0-*",
    "xunit": "2.1.0",
    "xunit.runner.dnx": "2.1.0-rc1-*"
  },
  "commands": {
    "test": "xunit.runner.dnx"
  },
  "frameworks": {
    "dnx451": {
      "dependencies": {
        "Moq": "4.2.1312.1622"
      }
    }
  }
}
用于测试AccountController的测试类示例:

using {Your NS}.Controllers;
using Microsoft.AspNet.Identity;
using Moq;
using Xunit;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc;
using Microsoft.Extensions.OptionsModel;
using System.Threading;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.ModelBinding;
using System.Collections.Generic;
using Microsoft.AspNet.Mvc.ViewFeatures;
using Microsoft.Extensions.Logging;

namespace NS.test.Controllers
{
    public class TestRole
    {
        public string Id { get; private set; }
        public string Name { get; set; }
    }

    public interface ITestUserStore<T>:IUserStore<T>, IUserPasswordStore<T> where T :class
    { }

    public class AccountControllerTest
    {
        private static UserManager<TUser> GetUserManager<TUser>(List<IUserValidator<TUser>> userValidators) where TUser : class
        {
            var store = new Mock<ITestUserStore<TUser>>();
            store.Setup(s => s.CreateAsync(It.IsAny<TUser>(), It.IsAny<CancellationToken>())).ReturnsAsync(IdentityResult.Success);
            var options = new Mock<IOptions<IdentityOptions>>();
            var idOptions = new IdentityOptions();
            idOptions.Lockout.AllowedForNewUsers = false;
            options.Setup(o => o.Value).Returns(idOptions);
            var pwdValidators = new List<PasswordValidator<TUser>>();
            pwdValidators.Add(new PasswordValidator<TUser>());
            var userManager = new UserManager<TUser>(store.Object, options.Object, new PasswordHasher<TUser>(),
                userValidators, pwdValidators, new UpperInvariantLookupNormalizer(),
                new IdentityErrorDescriber(), null,
                new Mock<ILogger<UserManager<TUser>>>().Object,
                null);

            return userManager;
        }

        private static Mock<SignInManager<TUser>> MockSigninManager<TUser>(UserManager<TUser> userManager) where TUser : class
        {            
            var context = new Mock<HttpContext>();
            var contextAccessor = new Mock<IHttpContextAccessor>();
            contextAccessor.Setup(a => a.HttpContext).Returns(context.Object);

            var roleManager = new RoleManager<TestRole>(new Mock<IRoleStore<TestRole>>().Object,new RoleValidator<TestRole>[] { new RoleValidator<TestRole>() }, null, null, null, null);
            var identityOptions = new IdentityOptions();
            var options = new Mock<IOptions<IdentityOptions>>();
            options.Setup(a => a.Value).Returns(identityOptions);
            var claimsFactory = new UserClaimsPrincipalFactory<TUser, TestRole>(userManager, roleManager, options.Object);
            return new Mock<SignInManager<TUser>>(userManager, contextAccessor.Object, claimsFactory, options.Object, null);
        }


        [Fact]
        public async Task RegisterTest()
        {
            var userValidators = new List<IUserValidator<YourUser>>();
            var validator = new Mock<IUserValidator<YourUser>>();
            userValidators.Add(validator.Object);
            var userManager = GetUserManager(userValidators);

            validator.Setup(v => v.ValidateAsync(userManager, It.IsAny<ChatLeUser>()))
               .Returns(Task.FromResult(IdentityResult.Success)).Verifiable();

            var signinManager = MockSigninManager<YourUser>(userManager);
            signinManager.Setup(m => m.SignInAsync(It.IsAny<YourUser>(), It.IsAny<bool>(), null)).Returns(Task.FromResult(0)).Verifiable();
            var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary());
            using (var controller = new AccountController(userManager, signinManager.Object) { ViewData = viewData })
            {
                var result = await controller.Register(new RegisterViewModel()
                {
                    ConfirmPassword = "test123",
                    Password = "Test123-123",
                    UserName = "test"
                });

                Assert.IsType<RedirectToActionResult>(result);
            }
        }
    }
}
使用{yourns}.controller;
使用Microsoft.AspNet.Identity;
使用最小起订量;
使用Xunit;
使用System.Threading.Tasks;
使用Microsoft.AspNet.Mvc;
使用Microsoft.Extensions.OptionsModel;
使用系统线程;
使用Microsoft.AspNet.Http;
使用Microsoft.AspNet.Mvc.ModelBinding;
使用System.Collections.Generic;
使用Microsoft.AspNet.Mvc.ViewFeatures;
使用Microsoft.Extensions.Logging;
命名空间NS.test.Controllers
{
公共类TestRole
{
公共字符串Id{get;private set;}
公共字符串名称{get;set;}
}
公共接口ITestUserStore:IUserStore,IUserPasswordStore其中T:class
{ }
公共类AccountControllerTest
{
私有静态UserManager GetUserManager(列出UserValidator),其中TUser:class
{
var store=newmock();
store.Setup(s=>s.CreateAsync(It.IsAny(),It.IsAny()).ReturnsAsync(IdentityResult.Success);
var options=newmock();
var idOptions=新标识选项();
idOptions.locket.AllowedForNewUsers=false;
options.Setup(o=>o.Value).Returns(idOptions);
var pwdValidators=新列表();
添加(新的密码验证器());
var userManager=new userManager(store.Object,options.Object,new PasswordHasher(),
UserValidator、PWDValidator、新的UpperInvariantLookupNormalizer(),
新的IdentityErrorDescriber(),null,
新建Mock().Object,
无效);
返回userManager;
}
私有静态模拟MockSigninManager(UserManager UserManager),其中TUser:class
{            
var context=newmock();
var contextAccessor=new Mock();
Setup(a=>a.HttpContext).Returns(context.Object);
var roleManager=new roleManager(new Mock().Object,new RoleValidator[]{new RoleValidator()},null,null,null);
var identityOptions=新identityOptions();
var options=newmock();
options.Setup(a=>a.Value).返回(identityOptions);
var claimsFactory=new UserClaimsPrincipalFactory(userManager、rolemager、options.Object);
返回新的Mock(userManager、contextAccessor.Object、claimsFactory、options.Object、null);
}
[事实]
公共异步任务注册表测试()
{
var userValidators=新列表();
var validator=new Mock();
添加(validator.Object);
var userManager=GetUserManager(userValidators);
Setup(v=>v.validateSync(userManager,It.IsAny())
.Returns(Task.FromResult(IdentityResult.Success)).Verifiable();
var-signinManager=MockSigninManager(userManager);
signinManager.Setup(m=>m.SignInAsync(It.IsAny(),It.IsAny(),null)).Returns(Task.FromResult(0)).Verifiable();
var viewData=new ViewDataDictionary(new EmptyModelMetadataProvider(),new ModelStateDictionary());
使用(var controller=newaccountcontroller(userManager,signinManager.Object){ViewData=ViewData})
{
var result=await controller.Register(新的RegisterViewModel()
{
ConfirmPassword=“test123”,
Password=“Test123-123”,
用户名=“测试”
});
Assert.IsType(结果);
}
}
}
}

您可以努力在内存中测试DbContext(如中所述)。但是需要注意的是,IdentityDbContext接受第三个参数,而DbContext没有,因此您可能需要了解如何使用它。这与内存存储中提供的EF7完全不同。@Jeroenvanevel感谢您的回复,我尝试按照您的建议使用Effort,问题是IdentityDbContext的当前实现只包含一个无参数构造函数,因此我无法传递从EffortThank获得的连接字符串。谢谢!这正是我需要的。需要注意的是,xunit.runner.kre不再受支持,我将其更改为xunit.runner.aspnet,一切都进行得非常顺利我在调试模式下使用aspnet runner时遇到了多线程问题!我忘了说您还需要向xunit添加一个依赖项(对此很抱歉),更多信息我将通过修复构建版本重试,也许这会有帮助,因为VS无法使用,我尝试了
“xunit”:“2.1.0-beta1-*”,“xunit.runner.aspnet”:“2.1.0-beta1-*”
,但VS没有发现测试。我尝试了
“xunit”:“2.1.0-beta1-*”,“xunit.runner.aspnet”:“2.1.0-beta1-*”
;VS被卡住了