Создайте новый файл 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 не обеспечивают понимание (что реализует этот интерфейс?).
Что мне нужно сделать/Есть ли лучший способ сделать это?
Спасибо.
Ответы
Ответ 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);
}