gpt4 book ai didi

c# - 模拟 DbSet 内联

转载 作者:行者123 更新时间:2023-11-30 18:22:08 25 4
gpt4 key购买 nike

我正在使用 .NET4.5 , EF6 , 和 Moq用于单元测试。我正在尝试模拟一些 Db 数据进行测试。我有一个示例如何通过声明 mockset as variable and then using mocks. 来做到这一点

public static class TestExtensionMethods
{
public static DbSet<T> AsDbSet<T>(this List<T> sourceList) where T : class
{
var queryable = sourceList.AsQueryable();

var dbSet = new Mock<DbSet<T>>();
dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryable.GetEnumerator());
dbSet.Setup(d => d.Add(It.IsAny<T>())).Callback<T>(sourceList.Add);
return dbSet.Object;
}
}

我将它用作 ATM 的扩展方法,例如:mockedDbContext.Journey = new List<Journey> { }.AsDbSet();

有没有办法将其全部声明为一行(这样我就可以将数据库集作为 TestCaseData 传递,而无需编写扩展方法)。我试过以下

var mockedDbContext = new Mock<OnlineLegal>();
mockedDbContext.Setup(o => o.Journey).Returns(() => (DbSet<Journey>)(new List<Journey> { new Journey { SessionId = sessionId, ConveyancingAnswer = new Collection<ConveyancingAnswer>()} }.AsEnumerable()));

但它爆炸了 System.InvalidCastException : Unable to cast object of type 'System.Collections.Generic.List1[Saga.Services.Legal.Website.Journey]' to type 'System.Data.Entity.DbSet1[Saga.Services.Legal.Website.Journey]'.

我如何模拟 DbSet<T>内联?

编辑:关于重复问题,标记我的问题的人没有花更多精力阅读标题,今年将从圣诞老人那里得到沙林毒气。

最佳答案

在这种情况下,使用您定义的方法从列表创建 DbSet,其中 T 是类型 Journey并假设 o.Journey类型为 DbSet<Journey> .

private DbSet<T> ToDbSet<T>(List<T> sourceList) where T : class
{
var queryable = sourceList.AsQueryable();

var dbSet = new Mock<DbSet<T>>();
dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryable.GetEnumerator());
dbSet.Setup(d => d.Add(It.IsAny<T>())).Callback<T>(sourceList.Add);
return dbSet.Object;
}

private void SomeOtherMethod()
{
var journey = new Journey
{
SessionId = sessionId,
ConveyancingAnswer = new Collection<ConveyancingAnswer>()
};
var journeys = new List<Journey> { journey };
mockedDbContext.Setup(o => o.Journey)
.Returns(() => ToDbSet<Journey>(journeys));
}

如果你想把它放在一行上,那么它是可能的,但就可读性而言不一定是理想的。

关于c# - 模拟 DbSet<T> 内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34332761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com