簡體   English   中英

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

[英]How to return DbRawSqlQuery in Moq setup method

我有一個過程服務,其中僅包含這樣的方法:

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

因此,所有方法都返回DbRawSqlQuery ,然后在應用程序的上層,將它們轉換為IEnumerable 但出於某些地方的測試目的,我必須設置此方法。 問題是類DbRawSqlQuery確實有一個內部構造函數( 我知道Moq不接受內部構造函數 ),但是我不知道是否有某種方法可以使此代碼起作用:

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

目前,由於DbRawSqlQuery無法輕松實例化,因此無法正常工作。

編輯1:

以下是更多詳細信息:

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));
}

任何幫助深表感謝!

干杯!

我可以使它工作,實際上我不喜歡更改整個IProcedureService的想法,因為它確實從實體框架返回了一個內置的類型。 由於我是從過程服務中獲取數據並將其返回到IEnumerable所以我只需要關心GetEnumerator()方法,因此我想到的是首先檢查內部代碼的構造方式,我發現DbSqlQuery是從DbRawSqlQuery和沒有內部構造函數的問題。 在這種情況下,我創建了一個名為新類TestDbSqlQuery這會從繼承DbSqlQuery 該類如下所示:

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方法中檢索它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM