使用Moq进行DbSet查找(EntityFramework.Testing.Moq)

时间:2015-09-07 17:13:17

标签: asp.net-mvc entity-framework 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);

我会回来的。

现在,我已经能够通过这样的设置来完成这项工作:

context.Setup(m => m.Blogs.Find(It.IsAny<int>()))
   .Returns<object[]>(s => data.Find(d => d.Blogs == (int)s[0]));

但是我想知道我是不是在做错事,如果我以某种方式使事情变得复杂。

感谢您的任何建议!

1 个答案:

答案 0 :(得分:3)

如果查看df2 = p.DataFrame([l1,l2]) 方法的签名

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