加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 使用Moq查找DbSet(EntityFramework.Testing.Moq)

发布时间:2020-12-16 09:55:33 所属栏目:asp.Net 来源:网络整理
导读:我一直在使用Moq对象以及 EntityFramework.Testing.Moq扩展,我最近遇到了尝试进行查找的问题.我认为是对的,只是做这样的设置(来自文档): // Create some test datavar data = new ListBlog{ new Blog{ Id = 1,Name = "BBB" },new Blog{ Id = 2,Name = "CCC"
我一直在使用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 Find时,就像这样:

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]));

但是我想知道我是不是首先做错了什么,如果我在某种程度上使事情变得复杂.

谢谢你的任何建议!

解决方法

如果查看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()));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读