Moq - метод установки с выражением анонимного типа - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть функция с этой подписью -

TSelect Get<TSelect>(int id, Expression<Func<T, TSelect>> select);

T объявлено на уровне класса. Он предназначен для того, чтобы позволить разработчикам передавать в форме, которую они sh возвращают объекту, как .Select в Linq.

Так что его использование выглядит как

_query.Get(123, x => new { x.Id, x.Name })

Я не могу понять, как настроить это в Moq. Я видел много ответов об использовании It.IsAnyType, но, похоже, это не работает в выражении. А Moq не сопоставляет анонимные типы с объектами по дизайну, поэтому Expression<Func<MyType, object>> не работает.

Есть идеи?

1 Ответ

0 голосов
/ 22 февраля 2020

Если ваша цель состоит в том, чтобы макетировать функцию select, которая возвращает экземпляр анонимного типа, вы можете добиться этого с помощью вспомогательной функции:

public class MyUnitTest
{
    [Fact]
    public void Test()
    {
        var query = CreateMockQuery(
            new Person { Name = "Bob" },
            new { Id = default(int), Name = default(string) } // Declares the anonymous type
        );

        var result = query.Get(5, p => new { Id = 5, p.Name });
        Assert.Equal("Bob", result.Name);
    }

    private IQuery<T> CreateMockQuery<T, TSelect>(
        T source,
        TSelect _ /* captures the anonymous type*/)
    {
        var mockQuery = new Mock<IQuery<T>>();
        mockQuery
            .Setup(x => x.Get(It.IsAny<int>(), It.IsAny<Expression<Func<T, TSelect>>>()))
            .Returns(
                (int id, Expression<Func<T, TSelect>> select)
                    => select.Compile()(source));
        return mockQuery.Object;
    }
}

public class Person
{
    public string Name { get; set; }
}

public interface IQuery<T>
{
    TSelect Get<TSelect>(int id, Expression<Func<T, TSelect>> select);
}

Чтобы избежать передачи анонимного типа как Аргумент типа c, мы можем передать его в качестве ввода CreateMockQuery, чтобы компилятор мог автоматически определить тип.

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