[英]How to setup Moq for the same method where return value depends on input?
[英]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.