C # Moq Entity Framework 6 Data Entry Context Add Operation

I want to verify that the method adds an entry to the DBSet under a certain condition:

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

Now I already have tests for CopyToInternalTransaction (). I just need to call AddTriggeredInternalTransactions () and make sure that [condition A] leads to adding a new record).

I started with http://msdn.microsoft.com/en-us/data/dn314429.aspx , then used other Google searches and StackOverflow. Before starting my “real” test, I try to do a simple test to check if a record has been added to the dataset, but I'm stuck on this. Can anyone point out my flaws?

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 DbSet ~ 1Proxy_1, DbSet1. DbSet1 , ."

+4
1

, :

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());
+1

Source: https://habr.com/ru/post/1547427/


All Articles