用几句话。 Wpf应用程序,使用。我需要使用模拟和统一来测试模型行为。统一和模拟对我来说似乎很清楚。用模拟环境提供我的模拟模型
问题如下:
模型没有通过它的构造函数获取上下文。它采用了同时执行这样的方法的背景下:
public Toys[] Get()
{
using (Context context = new Context())
{
return context.Toys.ToArray();
}
}
这是我尝试测试:
[TestClass]
public class TestToyModel
{
[TestMethod]
public void TestToyCreate()
{
List<Toy> toys = new List<Toy>();
toys.Add(new Toy{ Id = "1234", Name = "Toy1" });
DbSet<Toy> dbToys = GetQueryableMockDbSet(toys);
Mock<ToyModel> model = new Mock<ToyModel>();
Mock<Context> context = new Mock<Context>();
context.Setup(x => x.Toys).Returns(dbToys);
//it' s all for now
}
private static DbSet<T> GetQueryableMockDbSet<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>((s) => sourceList.Add(s));
return dbSet.Object;
}
}
我如何可以提供我的模拟模型模拟情境?
抽象上下文,以便它可以被嘲笑。提供问题的[mcve],以便评估解决方案。 – Nkosi
问题不清楚。没有足够的信息提供时,不能提供明确的答案。 – Nkosi
通常嘲笑你的'DbContext'不是一个好主意,因为会导致错误的安全感。在你的例子中,你正在使用'List'来模拟数据库,但是这与EF如何处理查询差距很大。例如,你可以从'Where'扩展方法调用方法,这些方法对'List '可以很好地工作,但是当使用EF时会导致运行时异常。 –