我有一个带有ApiController继承控制器的ASP.NET MVC4 Web API项目,该控制器接受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的默认参数的情况下,我也需要知道如何实例化一个。这很棘手:
我需要做什么/有更好的方法吗?
感谢。
答案 0 :(得分:7)
在评论here中看起来其他人已经回答了这个问题,但这不是我的用例的完整解决方案(请参阅下面的评论):
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Customer>("Customers");
var opts = new ODataQueryOptions<Customer>(new ODataQueryContext(modelBuilder.GetEdmModel(),typeof(Customer)), request);
答案 1 :(得分:1)
这是我在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);
}