带有Moq的DbSet查找(EntityFramework.Testing.Moq) [英] DbSet Find with Moq (EntityFramework.Testing.Moq)

查看:72
本文介绍了带有Moq的DbSet查找(EntityFramework.Testing.Moq)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用Moq对象以及 EntityFramework.Testing.Moq 扩展名,我最近遇到了麻烦,尝试执行查找".我原以为是的,只是进行这样的设置(来自文档):

I've been using the Moq objects along with EntityFramework.Testing.Moq extension and I recently hit a bump trying to do a Find. What I had thought was right, that simply doing a setup like this (from the documentation):

// 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();

在控制器中,我可以(再次从文档中)执行此操作:

In the controller, I could do this (again, from the doc):

var query = db.Blogs.OrderBy(b => b.Name);

但是,然后,当我尝试执行DbSet查找时,使用模型的键进行如下操作:

But, then when I tried to do a DbSet Find, like this using the model's key:

var b = db.Blogs.Find(1);

我会返回空值.

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

Now, I've been able to make this work by doing my setup like this:

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

但是我只是想知道我是否首先做错了什么,以及我是否正在以某种方式使事情复杂化.

but I'm left wondering if I was doing something wrong in the first place and if I am over complicating things somehow.

谢谢您的建议!

推荐答案

如果您查看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

您可以看到必须在该方法调用中指定查找谓词.这样一来,您不必进行额外的调用即可设置您的上下文.

You can see that you have to specify your find predicate in that method call. By doing so, you shouldn't have to do an extra call to setup your context.

您可以这样做:

var set = new Mock<DbSet<Blog>>()
    .SetupData(data, objects => data.SingleOrDefault(d => d.Id == (int) objects.First()));

这篇关于带有Moq的DbSet查找(EntityFramework.Testing.Moq)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆