DbSet 查找最小起订量 (EntityFramework.Testing.Moq)
DbSet Find with Moq (EntityFramework.Testing.Moq)
我一直在使用 Moq 对象和 EntityFramework.Testing.Moq 扩展,最近我在尝试查找时遇到了困难。我的想法是正确的,只需像这样进行设置(来自文档):
// Create some test data
var data = new List<Blog>
{
new Blog{ Id = 1, Name = "BBB" },
new Blog{ Id = 2, Name = "CCC" },
new Blog{ Id = 3, Name = "AAA" }
};
// Create a mock set and context
var set = new Mock<DbSet<Blog>>()
.SetupData(data);
var context = new Mock<BloggingContext>();
context.Setup(c => c.Blogs).Returns(set.Object);
// Create a BlogsController and invoke the Index action
var controller = new BlogsController(context.Object);
var result = await controller.Index();
在控制器中,我可以这样做(同样,来自文档):
var query = db.Blogs.OrderBy(b => b.Name);
但是,当我尝试使用模型的键进行 DbSet 查找时:
var b = db.Blogs.Find(1);
我会返回 null。
现在,我已经能够通过如下设置完成这项工作:
context.Setup(m => m.Blogs.Find(It.IsAny<int>()))
.Returns<object[]>(s => data.Find(d => d.Blogs == (int)s[0]));
但我想知道我是否首先做错了什么,以及我是否以某种方式使事情复杂化。
感谢任何建议!
如果您查看 SetupData
方法的签名
public static Mock<DbSet<TEntity>> SetupData<TEntity>(this Mock<DbSet<TEntity>> mock, ICollection<TEntity> data = null, Func<object[], TEntity> find = null) where TEntity : class
您可以看到您必须在该方法调用中指定查找谓词。通过这样做,您不必进行额外的调用来设置您的上下文。
您可以这样做:
var set = new Mock<DbSet<Blog>>()
.SetupData(data, objects => data.SingleOrDefault(d => d.Id == (int) objects.First()));
我一直在使用 Moq 对象和 EntityFramework.Testing.Moq 扩展,最近我在尝试查找时遇到了困难。我的想法是正确的,只需像这样进行设置(来自文档):
// Create some test data
var data = new List<Blog>
{
new Blog{ Id = 1, Name = "BBB" },
new Blog{ Id = 2, Name = "CCC" },
new Blog{ Id = 3, Name = "AAA" }
};
// Create a mock set and context
var set = new Mock<DbSet<Blog>>()
.SetupData(data);
var context = new Mock<BloggingContext>();
context.Setup(c => c.Blogs).Returns(set.Object);
// Create a BlogsController and invoke the Index action
var controller = new BlogsController(context.Object);
var result = await controller.Index();
在控制器中,我可以这样做(同样,来自文档):
var query = db.Blogs.OrderBy(b => b.Name);
但是,当我尝试使用模型的键进行 DbSet 查找时:
var b = db.Blogs.Find(1);
我会返回 null。
现在,我已经能够通过如下设置完成这项工作:
context.Setup(m => m.Blogs.Find(It.IsAny<int>()))
.Returns<object[]>(s => data.Find(d => d.Blogs == (int)s[0]));
但我想知道我是否首先做错了什么,以及我是否以某种方式使事情复杂化。
感谢任何建议!
如果您查看 SetupData
方法的签名
public static Mock<DbSet<TEntity>> SetupData<TEntity>(this Mock<DbSet<TEntity>> mock, ICollection<TEntity> data = null, Func<object[], TEntity> find = null) where TEntity : class
您可以看到您必须在该方法调用中指定查找谓词。通过这样做,您不必进行额外的调用来设置您的上下文。
您可以这样做:
var set = new Mock<DbSet<Blog>>()
.SetupData(data, objects => data.SingleOrDefault(d => d.Id == (int) objects.First()));