代码之家  ›  专栏  ›  技术社区  ›  Rey

如何在Moq设置方法中返回DbRawSqlQuery

  •  0
  • Rey  · 技术社区  · 7 年前

    DbRawSqlQuery<UserVesselPermissionsResult> GetUserVesselPermissions(Guid userId, DateTime date);
    

    DbRawSqlQuery ,然后在应用程序的某个上层将它们转换为 IEnumerable . 但是为了在某些地方进行测试,我必须设置这个方法。问题是这个班 DbRawSqlQuery数据库 是否有内部构造函数( )但我不知道是否有办法让这个代码工作:

    _procedureService.Setup(x => x.GetUserVesselPermissions(It.IsAny<Guid>(), It.IsAny<DateTime>()))
                .Returns(new DbRawSqlQuery<UserVesselPermissionsResult>(null));
    

    目前由于以下原因无法工作 DbRawSqlQuery数据库 不易实例化。

    以下是一些详细信息:

    public class IMembershipService
    {
        private readonly IProcedureService _procedureService;
        public MembershipService(IProcedureService procedureService)
        {
            _procedureService = procedureService;
        }
    
        public List<UserVesselPermissionsResult> UserPermissions => _procedureService.GetUserVesselPermissions(UserId, DateTime.Now).ToList();
    
    
        public bool UserHasPermissionOrAdmin(YcoEnum.UIPermission permission)
        {
            if (IsUserAdministrator)
                return true;
            var userVesselPermissions = UserVesselPermissions; //Here I have to make the setup
            if (userVesselPermissions == null)
                return false;
            var userSelectedVesselId = UserSelectedVesselId;
            return //something
        } 
    }
    

    测试方法如下所示:

    [TestCase(true)]
    [TestCase(false)]
    public void UserHasAllPermissionsOrAdmin_IsAdminOrNot_ReturnsTrue(bool isAdmin)
    { 
        //Arrange
        _membershipService.IsUserAdministrator = isAdmin;
        var claims = new List<Claim>()
        {
            new Claim(ClaimTypes.Name, "rajmondi@outlook.com"),
            new Claim(ClaimTypes.NameIdentifier, Guid.NewGuid().ToString())
        };
        var identity = new ClaimsIdentity(claims, "TestAuthType");
        var claimsPrincipal = new ClaimsPrincipal(identity);
        _authenticationManager.Setup(x => x.User).Returns(claimsPrincipal);
    
        _procedureService.Setup(x => x.GetUserVesselPermissions(It.IsAny<Guid>(), It.IsAny<DateTime>()))
            .Returns((DbRawSqlQuery<UserVesselPermissionsResult>) null);//Here I dont know how to set it up due to DbRawSqlQuery
        //Action
    
        var result = _membershipService.UserHasAllPermissions(It.IsAny<YcoEnum.UIPermission>());
        //Assert
        Assert.That(result, Is.EqualTo(true));
    }
    

    干杯!

    1 回复  |  直到 7 年前
        1
  •  2
  •   Rey    7 年前

    我可以让它工作,我其实不喜欢改变整体的想法 IProcedureService 因为它确实从实体框架返回了一个构建的int类型。因为我从程序服务获取数据并将它们返回到 IEnumerable 我只需要关心 GetEnumerator() 方法,所以我想首先检查代码是如何构造的,我发现 DbSqlQuery 继承自 DbRawSqlQuery 没有内部构造函数的问题。在本例中,我创建了一个名为 TestDbSqlQuery 会从 数据库查询 . 这个班级是这样的:

    public class TestDbSqlQuery<T> : DbSqlQuery<T> where T : class
    {
        private readonly List<T> _innerList; 
    
        public TestDbSqlQuery(List<T> innerList)
        {
            _innerList = innerList;
        }
    
        public override IEnumerator<T> GetEnumerator()
        {
            return _innerList.GetEnumerator();
        }
    }
    

    我故意加上 Lis<T> 作为参数,以便我可以将数据存储在该列表中,然后使用我的重写 IEnumerator<T> .

    _procedureService.Setup(x => x.GetUserVesselPermissions(It.IsAny<Guid>(), It.IsAny<DateTime>()))
    .Returns(new TestDbSqlQuery<UserVesselPermissionsResult>(new List<UserVesselPermissionsResult>
    {
        new UserVesselPermissionsResult
        {
            PermissionId = 1
        }
    }));
    

    TestDbSqlQuery测试数据库 可以根据需要进行修改,但想法是一样的,只需将对象存储在某个容器中,然后在中检索它们 GetEnumerator 方法。

    推荐文章