gpt4 book ai didi

C# Moq Entity Framework 6 数据上下文添加操作

转载 作者:行者123 更新时间:2023-11-30 12:45:26 25 4
gpt4 key购买 nike

我想测试一个方法在特定条件下向 DBSet 添加记录:

public static void AddTriggeredInternalTransactions(IDataContext dc, ExternalTransaction transaction)
{
if (transaction [meets condition A])
dc.InternalTransactions.CreateInverseTransaction(transaction);

// do other stuff under other conditions
}

private static void CreateInverseTransaction(this IDbSet<InternalTransaction> transactions, ExternalTransaction from)
{
var internalTransaction = transactions.Create();
from.CopyToInternalTransaction(internalTransaction);
transactions.Add(internalTransaction);
}

现在,我已经对 CopyToInternalTransaction() 进行了测试。我只需要调用 AddTriggeredInternalTransactions() 并验证 [条件 A] 会导致添加新记录)。

我从 http://msdn.microsoft.com/en-us/data/dn314429.aspx 开始,然后使用其他 Google 和 StackOverflow 搜索。在处理我的“真实”测试之前,我试图做一个简单的测试来验证是否已将记录添加到数据集中,但我坚持这样做。谁能指出我的缺点?

var internals = new Mock<DbSet<InternalTransaction>>();
var theData = new List<InternalTransaction>().AsQueryable();

internals.As<IQueryable<InternalTransaction>>().Setup(m => m.Provider).Returns(theData.Provider);
internals.As<IQueryable<InternalTransaction>>().Setup(m => m.Expression).Returns(theData.Expression);
internals.As<IQueryable<InternalTransaction>>().Setup(m => m.ElementType).Returns(theData.ElementType);
internals.As<IQueryable<InternalTransaction>>().Setup(m => m.GetEnumerator()).Returns(theData.GetEnumerator());

var mockDC = new Mock<IDataContext>();
mockDC.Setup(q => q.InternalTransactions).Returns(internals.Object);
mockDC.Setup(q => q.InternalTransactions.Create()).Returns(new InternalTransaction());
mockDC.Setup(q => q.InternalTransactions.Add(It.IsAny<InternalTransaction>()));

var it = mockDC.Object.InternalTransactions.Create();
it.Id = "123";
mockDC.Object.InternalTransactions.Add(it);

internals.Verify(e => e.Add(It.Is<InternalTransaction>(d => d.Id == "123")), Times.Once());
//or: Assert.Equal(1, mockDC.Object.InternalTransactions.Count());

此测试失败:预期对模拟调用一次,但为 0 次:e => e.Add(It.Is(d => d.Id == "123")) 未配置任何设置。未执行任何调用。

如果改为使用 Assert 语句,则会失败并出现 NotImplementedException:“成员 IQueryable.Provider 尚未在继承自 DbSet1 的 DbSet~1Proxy_1 类型上实现。DbSet1 的测试替身必须提供所使用的方法和属性的实现”

最佳答案

在 Adam 和 Stuart 的评论加上进一步的实验之后,我能够将我的测试用例缩减为以下工作测试用例:

var internals = new Mock<DbSet<InternalTransaction>>();
var mockDC = new Mock<IDataContext>();

mockDC.Setup(q => q.InternalTransactions).Returns(internals.Object);
internals.Setup(q => q.Create()).Returns(new InternalTransaction());

var transaction = new ExternalTransaction { [set criteria for Condition A] };

SomeBusinessObject.AddTriggeredInternalTransactions(mockDC.Object, transaction);

// verify the Add method was executed exactly once
internals.Verify(e => e.Add(It.IsAny<InternalTransaction>()), Times.Once());

关于C# Moq Entity Framework 6 数据上下文添加操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24613187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com