alice
alice

Reputation: 49

Unable to mock OdataQueryOptions

I need to make unit tests for controllers in a web api that uses odata.

I have used Moq to mock the entity framework. I am unable to mock OdataQueryOptions to pass as a parameter to the actions of the controller.

[TestMethod]
    public void TestMethod1()
    {
        var data = new List<ActivationRequestLog>
        {
            new ActivationRequestLog { ActivationRequestLogID=1, SourceTokenType="happy", ProductKeyID=20140265000001, ActivationStatusCode="", AttemptDateOffset=null, HWID="", LogCreatedDateOffset=null },
            new ActivationRequestLog { ActivationRequestLogID=1, SourceTokenType="happy", ProductKeyID=20140265000001, ActivationStatusCode="", AttemptDateOffset=null, HWID="", LogCreatedDateOffset=null },
            new ActivationRequestLog { ActivationRequestLogID=1, SourceTokenType="happy", ProductKeyID=20140265000001, ActivationStatusCode="", AttemptDateOffset=null, HWID="", LogCreatedDateOffset=null },
        }.AsQueryable();

        var mockSet = new Mock<DbSet<ActivationRequestLog>>();
        mockSet.As<IQueryable<ActivationRequestLog>>().Setup(m => m.Provider).Returns(data.Provider);
        mockSet.As<IQueryable<ActivationRequestLog>>().Setup(m => m.Expression).Returns(data.Expression);
        mockSet.As<IQueryable<ActivationRequestLog>>().Setup(m => m.ElementType).Returns(data.ElementType);
        mockSet.As<IQueryable<ActivationRequestLog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
        var mockContext = new Mock<AVSDataAccessViewEntities>();
        mockContext.Setup(c => c.ActivationRequestLogs).Returns(mockSet.Object);
        var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/someurl");

        //var opts = new ODataQueryOptions<ActivationRequestLog>(new ODataQueryContext(modelBuilder.GetEdmModel(), typeof(ActivationRequestLog),path), request);
        var service = new AVSController(mockContext.Object);
        var activationRequestLog = service.GetActivationRequestLog(opts);
        Assert.AreEqual(2, activationRequestLog.Count());


    }
}

}

I need to find an appropriate way to initialize variable opts

Upvotes: 1

Views: 2382

Answers (1)

Fan Ouyang
Fan Ouyang

Reputation: 2132

Will the test from odata help you?

https://github.com/OData/WebApi/blob/master/OData/test/UnitTest/System.Web.OData.Test/OData/Query/EnableQueryAttributeTest.cs#L776

        ODataQueryContext context = new ODataQueryContext(EdmCoreModel.Instance, typeof(int));
        HttpRequestMessage request = new HttpRequestMessage();
        request.EnableHttpDependencyInjectionSupport();
        Mock<ODataQueryOptions> queryOptions = new Mock<ODataQueryOptions>(context, request);

Upvotes: 0

Related Questions