在 ASP.NET Web API 控制器的 nunit 测试中实例化新的 System.Web.Http.OData.Query.ODataQueryOptions

2024-01-11

我有一个 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 查找引用和查看调用层次结构不提供洞察力(什么实现了该接口?)。

我需要做什么/有更好的方法吗?

Thanks.


评论里好像已经有人回答过这个问题了here https://stackoverflow.com/questions/15790695/web-api-odata-inlinecount-and-testing?rq=1,但这不是我的用例的完整解决方案(请参阅下面的评论):

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
modelBuilder.EntitySet<Customer>("Customers"); 
var opts = new ODataQueryOptions<Customer>(new ODataQueryContext(modelBuilder.GetEdmModel(),typeof(Customer)), request);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ASP.NET Web API 控制器的 nunit 测试中实例化新的 System.Web.Http.OData.Query.ODataQueryOptions 的相关文章

随机推荐