2017-10-19 90 views
0

我正在開發一個NUnit,Moq,C#和.NET Framework 4.7的測試項目。在lambda表達式中使用泛型或如何使用泛型訪問dbset

我有這兩種方法是幾乎等於:

using Microsoft.EntityFrameworkCore; 
using Moq; 
using NUnit.Framework; 
using System; 
using System.Collections.Generic; 
using System.Linq; 

private void MockProducts(Mock<TRZFDbContext> mockContext, List<Product> data) 
{ 
    IQueryable<Product> queryable = data.AsQueryable(); 

    var mockSet = new Mock<DbSet<Product>>(); 

    mockSet.As<IQueryable<Product>>().Setup(m => m.Provider).Returns(queryable.Provider); 
    mockSet.As<IQueryable<Product>>().Setup(m => m.Expression).Returns(queryable.Expression); 
    mockSet.As<IQueryable<Product>>().Setup(m => m.ElementType).Returns(queryable.ElementType); 
    mockSet.As<IQueryable<Product>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator()); 
    mockSet.Setup(d => d.Add(It.IsAny<Product>())).Callback<Product>((s) => data.Add(s)); 
    mockSet.Setup(d => d.Remove(It.IsAny<Product>())).Callback<Product>((s) => data.Remove(s)); 

    mockContext.Setup(m => m.Product).Returns(mockSet.Object); 
} 

private void MockEmvoProducts(Mock<TRZFDbContext> mockContext, List<EmvoProduct> data) 
{ 
    IQueryable<EmvoProduct> queryable = data.AsQueryable(); 

    var mockSet = new Mock<DbSet<EmvoProduct>>(); 

    mockSet.As<IQueryable<EmvoProduct>>().Setup(m => m.Provider).Returns(queryable.Provider); 
    mockSet.As<IQueryable<EmvoProduct>>().Setup(m => m.Expression).Returns(queryable.Expression); 
    mockSet.As<IQueryable<EmvoProduct>>().Setup(m => m.ElementType).Returns(queryable.ElementType); 
    mockSet.As<IQueryable<EmvoProduct>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator()); 
    mockSet.Setup(d => d.Add(It.IsAny<EmvoProduct>())).Callback<EmvoProduct>((s) => data.Add(s)); 
    mockSet.Setup(d => d.Remove(It.IsAny<EmvoProduct>())).Callback<EmvoProduct>((s) => data.Remove(s)); 

    mockContext.Setup(m => m.EmvoProduct).Returns(mockSet.Object); 
} 

我可以創建一個泛型方法改變的第二個參數data與通用。但我的問題是最後一句:

mockContext.Setup(m => m.Product).Returns(mockSet.Object); 

mockContext.Setup(m => m.EmvoProduct).Returns(mockSet.Object); 

m.ProductProduct一個DbSet和m.EmvoProductEmvoProduct一個DbSet。

有沒有辦法讓lambda表達式使用泛型?或者也許有另一種方法。

+0

基本上你想創建功能設置? –

+0

是的。但問題是如何使它成爲泛型。也許我必須像在這裏一樣將最新的句子移到外面:https://www.rhyous.com/2015/04/10/how-to-mock-an-entity-framework-dbcontext-and-its-dbset-屬性/ – VansFannel

+0

鏈接中的哪個行號? –

回答

1

你應該能夠與被像這樣聲明的公共靜態類的擴展功能,這樣做

public static class DBSetExtensions { 

    public static void Setup<T>(this DbSet<T> list, Action<T> lamda){ 
     lamda(objectFromDbSet); 
    } 

} 

現在任何類,你有一個DbSet泛型,你應該能夠使用

mockSet.Setup(d => d.Add(It.IsAny<EmvoProduct>())) 

對於鏈接功能Callback,你需要他們在設置恢復任何對象從虛空上述改變對函數的返回類型。

+0

您可以添加一個關於如何使用你的答案?謝謝。 – VansFannel

+0

我已更新它。只要它是一個靜態函數,它就可以在你使用DBSet對象的任何地方工作 –