我可以创建一个可以添加到数据库中的模拟数据库上下文,然后进行搜索吗?

乔纳格隆

我有一个简单的文档管理器,它被插入到asp.net c#MVC项目中的控制器中。该项目是数据库优先的,并且Document表由索引documentId,该索引是一个自动递增的整数。

我一直在尝试编写一个测试,测试的以下实现,该测试CreateNewDocument在成功添加文档后会对其进行查找并返回新的文档ID。

问题是我找不到一种模拟方法MyEntityFrameWorkEntities,可以向linq添加文档,然后搜索该文档。我认为这是行不通的,因为被嘲弄的_context.Document.Add人实际上并没有做任何事情。

我的问题是:我可以以不同的方式设置模拟,以便可以保持现状DocumentManager并编写通过测试吗?

public class DocumentManager : IDocumentManager
{
    private readonly MyEntityFrameWorkEntities _context;

    public DocumentManager(MyEntityFrameWorkEntities context)
    {
        _context = context;
    }

    public int CreateNewDocument(int userId)
    {
        var newDocumentGuid = Guid.NewGuid(); 
        var newDocument = new Document
        {
            UserId = userId,
            DateCreated = DateTime.Now,
            DocumentGuid = newDocumentGuid
        };
        _context.Document.Add(newDocument);
        _context.SaveChanges();
        // the .First here doesn't return anything when called from tests
        return _context.Document.First(d => d.DocumentGuid == newDocumentGuid).DocumentId;
    }
}

public partial class MyEntityFrameWorkEntities : DbContext
{
    public MyEntityFrameWorkEntities() : base("name=MyEntityFrameWorkEntities")
    {
    }

    public virtual DbSet<Document> Document { get; set; }
    /* ...etc... */
}

和测试类:

[TestMethod]
public void TestCreateNewDocument()
{
    var mockContext = new Mock<MyEntityFrameWorkEntities>();

    var mockDocumentDbSet = GetQueryableMockDocumentDbSet();

    mockContext.Setup(m => m.Document).Returns(mockDocumentDbSet.Object);

    var documentManager = new DocumentManager(mockContext.Object);

    var newDocId = documentManager.CreateNewDocument(123);

    // This line doesn't get hit as the .First falls over before here
    Assert.AreNotEqual(newDocId, 0);
}

private static Mock<DbSet<Document>> GetQueryableMockDocumentDbSet()
{
    var data = new List<Document> { GetDocument(111, 11), GetDocument(222, 22), GetDocument(333, 33) }.AsQueryable();
    var mockDocumentDbSet = new Mock<DbSet<Document>>();
    mockDocumentDbSet.As<IQueryable<Document>>().Setup(m => m.Provider).Returns(data.Provider);
    mockDocumentDbSet.As<IQueryable<Document>>().Setup(m => m.Expression).Returns(data.Expression);
    mockDocumentDbSet.As<IQueryable<Document>>().Setup(m => m.ElementType).Returns(data.ElementType);
    mockDocumentDbSet.As<IQueryable<Document>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
    return mockDocumentDbSet;
}

private static Document GetDocument(int documentId, int userId)
{
    return new Document
    {
        DocumentId = documentId,
        UserId = userId,
        DateCreated = DateTime.Now.AddDays(-1),
        DocumentGuid = Guid.NewGuid(),
    };
}
李东

您可以使用回调设置模拟DbSet的Add()方法,该回调会将该项添加到支持列表中:

private static Mock<DbSet<Document>> GetQueryableMockDocumentDbSet()
{
    var data = new List<Document> { GetDocument(111, 11), GetDocument(222, 22), GetDocument(333, 33) };

    var mockDocumentDbSet = new Mock<DbSet<Document>>();
    mockDocumentDbSet.As<IQueryable<Document>>().Setup(m => m.Provider).Returns(data.AsQueryable().Provider);
    mockDocumentDbSet.As<IQueryable<Document>>().Setup(m => m.Expression).Returns(data.AsQueryable().Expression);
    mockDocumentDbSet.As<IQueryable<Document>>().Setup(m => m.ElementType).Returns(data.AsQueryable().ElementType);
    mockDocumentDbSet.As<IQueryable<Document>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
    mockDocumentDbSet.Setup(m => m.Add(It.IsAny<Document>())).Callback<Document>(data.Add);
    return mockDocumentDbSet;

}

然后,您对First()的后续调用应能够检索该项目。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

首先将现有视图添加到代码中数据库上下文?

来自分类Dev

将对象列表添加到Entity Framework中的数据库上下文

来自分类Dev

是否可以同时将数据添加到一个数据库中的3个表中

来自分类Dev

在我的域模型中有数据库上下文可以吗

来自分类Dev

我可以将对象添加到Access数据库中吗?

来自分类Dev

我可以将对象添加到Access数据库中吗?

来自分类Dev

我可以创建一个循环来更新SQL数据库吗?

来自分类Dev

我可以扩展API控制器来保存数据库上下文的变量吗?

来自分类Dev

我可以扩展API控制器来保存数据库上下文的变量吗?

来自分类Dev

在我的域模型中有数据库上下文是否可以

来自分类Dev

我可以在另一个SQLite数据库中存储一个SQLite数据库吗?

来自分类Dev

您可以在查询数据库后从最初是bool的sqlite数据库中解析一个int,然后将其解析回bool吗?

来自分类Dev

我有一个 firebase 数据库,我想从中访问一些嵌套节点,然后将数据列表添加到该特定节点

来自分类Dev

从数据库中绘制一个链接并将其添加到 HTML 中

来自分类Dev

重置Django数据库1.8我仍然可以创建一个新的超级用户吗?

来自分类Dev

peewee可以创建一个新的MySQL数据库吗

来自分类Dev

我需要创建一个用于Angular / Node演示的简单数据库。将这样的数据库添加到我的演示中的阻力最小的路径是什么?

来自分类Dev

在数据库表中搜索一列,然后将值添加到datagridview

来自分类Dev

为什么我的数据库上下文被处置

来自分类Dev

我可以在数据库中添加列,然后在模型中添加与这些列相对应的属性吗?

来自分类Dev

我可以在一个数据库操作中将列中的每个值乘以某个数字吗?

来自分类Dev

为什么在将数据添加到另一个数据库时我的数据库变空?

来自分类Dev

我需要不断向数据库中添加数据,但要保持上下文同步

来自分类Dev

查找并将数据库中的相关数据添加到另一个Excel工作表中

来自分类Dev

实体框架:两个不同的上下文和一个数据库

来自分类Dev

在游戏功能测试中可以模拟数据库连接吗?如何进行?

来自分类Dev

将表中缺少的列从一个数据库添加到另一数据库

来自分类Dev

关于oracle数据库和实例,我可以在XE版中创建数据库吗?

来自分类Dev

关于oracle数据库和实例,我可以在XE版中创建数据库吗?

Related 相关文章

  1. 1

    首先将现有视图添加到代码中数据库上下文?

  2. 2

    将对象列表添加到Entity Framework中的数据库上下文

  3. 3

    是否可以同时将数据添加到一个数据库中的3个表中

  4. 4

    在我的域模型中有数据库上下文可以吗

  5. 5

    我可以将对象添加到Access数据库中吗?

  6. 6

    我可以将对象添加到Access数据库中吗?

  7. 7

    我可以创建一个循环来更新SQL数据库吗?

  8. 8

    我可以扩展API控制器来保存数据库上下文的变量吗?

  9. 9

    我可以扩展API控制器来保存数据库上下文的变量吗?

  10. 10

    在我的域模型中有数据库上下文是否可以

  11. 11

    我可以在另一个SQLite数据库中存储一个SQLite数据库吗?

  12. 12

    您可以在查询数据库后从最初是bool的sqlite数据库中解析一个int,然后将其解析回bool吗?

  13. 13

    我有一个 firebase 数据库,我想从中访问一些嵌套节点,然后将数据列表添加到该特定节点

  14. 14

    从数据库中绘制一个链接并将其添加到 HTML 中

  15. 15

    重置Django数据库1.8我仍然可以创建一个新的超级用户吗?

  16. 16

    peewee可以创建一个新的MySQL数据库吗

  17. 17

    我需要创建一个用于Angular / Node演示的简单数据库。将这样的数据库添加到我的演示中的阻力最小的路径是什么?

  18. 18

    在数据库表中搜索一列,然后将值添加到datagridview

  19. 19

    为什么我的数据库上下文被处置

  20. 20

    我可以在数据库中添加列,然后在模型中添加与这些列相对应的属性吗?

  21. 21

    我可以在一个数据库操作中将列中的每个值乘以某个数字吗?

  22. 22

    为什么在将数据添加到另一个数据库时我的数据库变空?

  23. 23

    我需要不断向数据库中添加数据,但要保持上下文同步

  24. 24

    查找并将数据库中的相关数据添加到另一个Excel工作表中

  25. 25

    实体框架:两个不同的上下文和一个数据库

  26. 26

    在游戏功能测试中可以模拟数据库连接吗?如何进行?

  27. 27

    将表中缺少的列从一个数据库添加到另一数据库

  28. 28

    关于oracle数据库和实例,我可以在XE版中创建数据库吗?

  29. 29

    关于oracle数据库和实例,我可以在XE版中创建数据库吗?

热门标签

归档