Как вернуть DbRawSqlQuery в метод установки Moq - PullRequest
0 голосов
/ 31 августа 2018

У меня есть служба процедур, которая содержит только такие методы:

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

Любая помощь очень ценится!

Ура!

1 Ответ

0 голосов
/ 31 августа 2018

Я мог бы заставить это работать, мне на самом деле не нравилась идея изменить целое IProcedureService только потому, что он возвращает тип встроенного int из структуры сущностей. Поскольку я получаю данные из службы процедур и возвращаю их в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...