单元测试ODataQueryOptions给出MissingMethodException DependencyInjection

时间:2018-03-06 15:39:00

标签: unit-testing dependency-injection asp.net-web-api2 odata missingmethodexception

所以这是我的问题,我有一个OData Web Api服务,它使用ODataQueryOptions来过滤来自我们的sql server的数据,我正在尝试设置.Net Framework Unit Test项目来测试具有不同查询选项的控制器。我一直在寻找几天,发现了许多例子,但大多数都使用旧版本的OData。 This example是我到目前为止找到的最好的,唯一的问题是调用config.EnableDependencyInjection();给了我以下例外:

找不到方法:'System.IServiceProvider Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(Microsoft.Extensions.DependencyInjection.IServiceCollection)'。

以下是我的代码示例:

using System.Collections.Generic; 
using System.Web.Http.Results;
using System.Web.OData;
using System.Web.OData.Query;
using System.Net.Http;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using University.API.OData.Controllers;
using University.API.OData.Models;
using System.Web.OData.Routing;
using System.Web.Http;
using System.Web.OData.Extensions;

[TestClass]
public class SalesforceUnitTest
{
    private HttpRequestMessage request;
    private ODataQueryOptions<Product> _options;

    [TestInitialize]
    public void TestInitialize()
    {
        request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/odata/product?$top=5");
        var model = WebApiConfig.GetModel();

        HttpConfiguration config = new HttpConfiguration();
        config.EnableDependencyInjection(); //Throws Missing Method Exception
        WebApiConfig.Register(config);
        config.EnsureInitialized();
        request.SetConfiguration(config);

        ODataQueryContext context = new ODataQueryContext(
            model,
            typeof(Product),
           new ODataPath(
               new Microsoft.OData.UriParser.EntitySetSegment(
                    model.EntityContainer.FindEntitySet("product"))
            )
        );

        _options = new ODataQueryOptions<Product>(context, request);
    }

    [TestMethod]
    public void ProductTest()
    {
        var controller = new ProductController();
        controller.Request = request;
        var response = controller.Get(_options);
        var contentResult = response as OkNegotiatedContentResult<List<Product>>;

        Assert.IsNotNull(contentResult);
        Assert.IsNotNull(contentResult.Content);
    }
}

如果您可能需要其他任何信息,请与我们联系。 感谢您提供的任何帮助。

编辑: 这里是单元测试项目中引用的内容:

EntityFramework
EntityFramework.SqlServer
Microsoft.Data.Edm
Microsoft.Data.OData
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.DependencyInjection.Abstractions
Microsoft.OData.Core
Microsoft.Odata.Edb
Microsoft.Spatial
Microsoft.Threading.Tasks
Microsoft.Threading.Tasks.Extensions
Microsoft.Threading.Tasks.Extensions.Desktop
Microsoft.VisualStudio.TestPlatform.TestFramework
Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions
System
System.ComponentModel.DataAnnotations
System.Net
System.Net.Http
System.Net.Http.Extensions
System.Net.Http.Primitives
System.Net.Http.WebRequest.
System.Spatial
System.Web
System.Web.Http
System.Web.OData
ODataAPI

1 个答案:

答案 0 :(得分:0)

经过多次挖掘后,我发现了这一点。我的单元测试项目似乎使用的是与我的ODataApi项目不同的版本。出于某种奇怪的原因,这导致了MissingMethodException而不是VersionMismatchException。希望这有助于其他正在研究为什么依赖注入不适用于您的单元测试项目的人。