簡體   English   中英

使用泛型返回類型和參數

[英]Use Generics for Return Type and Parameter

我正在編寫很多單元測試,並且由於我們框架的細節,每個人都需要這個使用DbSet和某些類型的模擬。 唯一的區別是類型,所以我想避免多次重復相同的方法,如果可能的話,有一個(也許)通用方法。 使用EF 6,.Net 4.7.1

這就是我現在擁有的:

private Mock<DbSet<MyClass>> MockSetupForDbSet(List<MyClass> expected)

    {

        var mockDbSet = new Mock<DbSet<MyClass>>();



        mockDbSet.As<IQueryable<MyClass>>()

            .Setup(m => m.Provider)

            .Returns(new TestDbAsyncQueryProvider<MyClass>(expected.AsQueryable().Provider));



        mockDbSet.As<IQueryable<MyClass>>().Setup(m => m.Expression).Returns(expected.AsQueryable().Expression);



        return mockDbSet;

    }

這就是我需要的:

private Mock<DbSet<T>> MockSetupForDbSet(List<T> expected) where T : class

    {

        var mockDbSet = new Mock<DbSet<T>>();



        mockDbSet.As<IQueryable<T>>()

            .Setup(m => m.Provider)

            .Returns(new TestDbAsyncQueryProvider<T>(expected.AsQueryable().Provider));



        mockDbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(expected.AsQueryable().Expression);



        return mockDbSet;

    }

這是正確的方法還是應該使用其他方法,例如dynamic參數?

-----編輯-----

這是泛型方法的最終版本,感謝StackOverflow成員的幫助(以防將來幫助某人):

internal static Mock<DbSet<T>> MockSetupForDbSet<T>(List<T> expected) where T : class

        {

            var mockDbSet = new Mock<DbSet<T>>();



            mockDbSet.As<IQueryable<T>>()

                .Setup(m => m.Provider)

                .Returns(new TestDbAsyncQueryProvider<T>(expected.AsQueryable().Provider));



            mockDbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(expected.AsQueryable().ElementType);



            mockDbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(expected.AsQueryable().GetEnumerator());



            mockDbSet.As<IDbAsyncEnumerable<T>>()

                .Setup(m => m.GetAsyncEnumerator())

                .Returns(new TestDbAsyncEnumerator<T>(expected.GetEnumerator()));



            mockDbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(expected.AsQueryable().Expression);



            return mockDbSet;

        }

測試是基於編寫的,取決於Microsoft文檔“使用模擬框架測試”: https//docs.microsoft.com/en-us/ef/ef6/fundamentals/testing/mocking#async

包括泛型類型參數

                                This
                                 |
                                 V
Mock<DbSet<T>> MockSetupForDbSet<T>(List<T> expected) where T : class {
    //...omitted for brevity
}

如果該函數不是泛型類的一部分

class MyClass<T> {
    Mock<DbSet<T>> MockSetupForDbSet(List<T> expected) where T : class {
        //...omitted for brevity
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM