Подтвердить что ты не робот

Создайте новый файл System.Web.Http.OData.Query.ODataQueryOptions в тесте nunit контроллера веб-API ASP.NET

У меня есть проект ASP.NET MVC4 Web API с контроллером, наследующим ApiController, который принимает параметр ODataQueryOptions как один из его входов.

Я использую NUnit и Moq для тестирования проекта, которые позволяют мне настраивать сохраненные ответы из соответствующих методов репозитория, используемых ApiController. Это работает, как в:

[TestFixture]
public class ProjectControllerTests
{
    [Test]
    public async Task GetById()
    {
        var repo = new Mock<IManagementQuery>();

        repo.Setup(a => a.GetProjectById(2)).Returns(Task.FromResult<Project>(new Project()
        { 
              ProjectID = 2, ProjectName = "Test project", ProjectClient = 3
        }));

        var controller = new ProjectController(repo.Object);
        var response = await controller.Get(2);

        Assert.AreEqual(response.id, 2);
        Assert.AreEqual(response.name, "Test project");
        Assert.AreEqual(response.clientId, 3);
    }
}

Проблема заключается в том, что для использования этого шаблона мне нужно передать соответствующие параметры запроса на контроллер, а также репозиторий (это было на самом деле моим намерением). Однако в случае ODataQueryOptions - принятия методов ApiController, даже в тех случаях, когда я хотел бы использовать только параметры по умолчанию для ODataQueryOptions, мне нужно знать, как их создать. Это становится сложно:

  • ODataQueryOptions не реализует интерфейс, поэтому я не могу издеваться над ним напрямую.
  • Для конструктора требуется реализация System.Web.Http.OData.ODataQueryContext, которая требует реализации чего-то, реализующего Microsoft.Data.Edm.IEdmModel, для которого документации недостаточно, а Visual Studio 2012 Find References и View Call Hierarchy не обеспечивают понимание (что реализует этот интерфейс?).

Что мне нужно сделать/Есть ли лучший способ сделать это?

Спасибо.

4b9b3361

Ответ 1

Похоже, что кто-то еще ответил на это в комментариях здесь, но это не полное решение для моего прецедента (см. комментарий ниже):

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
modelBuilder.EntitySet<Customer>("Customers"); 
var opts = new ODataQueryOptions<Customer>(new ODataQueryContext(modelBuilder.GetEdmModel(),typeof(Customer)), request);

Ответ 2

Это решение, которое я использовал в своих тестах NUnit для ввода ODataQueryOptions

private static IEdmModel _model;
private static IEdmModel Model
{
    get
    {
        if (_model == null)
        {
            var builder = new ODataConventionModelBuilder();

            var baseType = typeof(MyDbContext);
            var sets = baseType.GetProperties().Where(c => c.PropertyType.IsGenericType && c.PropertyType.GetGenericTypeDefinition() == typeof(IDbSet<>));
            var entitySetMethod = builder.GetType().GetMethod("EntitySet");
            foreach (var set in sets)
            {
                var genericMethod = entitySetMethod.MakeGenericMethod(set.PropertyType.GetGenericArguments());
                genericMethod.Invoke(builder, new object[] { set.Name });
            }

            _model = builder.GetEdmModel();
        }

        return _model;
    }
}

public static ODataQueryOptions<T> QueryOptions<T>(string query = null)
{
    query = query ?? "";
    var url = "http://localhost/Test?" + query;
    var request = new HttpRequestMessage(HttpMethod.Get, url);
    return new ODataQueryOptions<T>(new ODataQueryContext(Model, typeof(T)), request);
}