Moq -提取模拟数据集上下文到一个单独的类

本文关键字:一个 单独 提取 模拟 数据集 上下文 Moq | 更新日期: 2023-09-27 18:12:36

我有一个单元测试,验证一个函数添加一个记录到实体框架数据集,像这样:

var internals = new Mock<DbSet<InternalTransaction>>();
internals.Setup(q => q.Create()).Returns(new InternalTransaction());
var mockDC = new Mock<IDataContext>();
mockDC.Setup(q => q.InternalTransactions).Returns(internals.Object);
// Removed:  set up some data for my test
mockDC.Object.DoSomeFunction(data);
internals.Verify(e => e.Add(It.IsAny<InternalTransaction>()), Times.Once());

因为我有很多测试要做这个上下文,我试图提取模拟的东西到一个单独的类,像这样:

public static class DataContext_Creators
{
    public static Mock<IDataContext> CreateMockContext()
    {
        var internals = CreateMockDataSet<InternalTransaction>();
        var externals = CreateMockDataSet<ExternalTransaction>();
        var mockDC = new Mock<IDataContext>();
        mockDC.Setup(q => q.InternalTransactions).Returns(internals.Object);
        mockDC.Setup(q => q.ExternalTransactions).Returns(externals.Object);
        return mockDC;
    }
    private static Mock<DbSet<T>> CreateMockDataSet<T>() where T : class, new ()
    {
        var mockDataSet = new Mock<DbSet<T>>();
        mockDataSet.Setup(q => q.Create()).Returns(new T());
        // some other stuff, Provider, GetEnumerator, etc
        return mockDataSet;
    }
}

…然后把test改成:

mockContext = Common.DataContext_Creators.CreateMockContext();
context = mockContext.Object;
// Removed:  set up some data for my test
context.Object.DoSomeFunction(data);
//internals.Verify(e => e.Add(It.IsAny<InternalTransaction>()), Times.Once());

但是现在我不能访问"内部"了,我怎么能做。verify()语句?上下文。InternalTransactions不会工作,因为它返回"internals"。

Moq -提取模拟数据集上下文到一个单独的类

您可以通过使用Mock. get()方法再次从该对象中获得Mock对象。看一个例子:

public class Entity
{
    public virtual int Id { get; set; }
    public virtual int? ParentId { get; set; }
}
static void Main(string[] args)
{
    Entity entity = Mock.Of<Entity>();
    var mock = Mock.Get<Entity>(entity);
    mock.Setup(e => e.ParentId).Returns(11);
    var result = entity.ParentId;
    // now result == 11
}

您可以使用Mock。在内部获取方法。div对象

创建一个具有2个属性的新实用程序类:

Mock<IDataContext> DbContextMock
Mock<DbSet<InternalTransaction>> InternalTransMock

让您的Utility函数返回这个新对象,以便您的测试可以访问这两个对象。