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

C#Moq实体框架6数据上下文添加操作

发布时间:2020-12-16 07:09:15 所属栏目:百科 来源:网络整理
导读:我想测试一个方法在特定条件下向DBSet添加记录: public static void AddTriggeredInternalTransactions(IDataContext dc,ExternalTransaction transaction){ if (transaction [meets condition A]) dc.InternalTransactions.CreateInverseTransaction(trans
我想测试一个方法在特定条件下向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继承自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());

(编辑:李大同)

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

    推荐文章
      热点阅读