我有一个带有 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 的默认参数的情况下,我也需要知道如何实例化一个。这变得棘手:
- ODataQueryOptions 没有实现接口,所以不能直接mock。
- 构造函数需要一个 System.Web.Http.OData.ODataQueryContext 的实现,这需要一个实现 Microsoft.Data.Edm.IEdmModel 的东西的实现,文档很少,Visual Studio 2012 Find References 和 View Call Hierarchy 不提供洞察力(什么实现了该接口?)。
我需要做什么/有更好的方法吗?
谢谢。