Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何验证已在模拟DbContext上调用RemoveRange?_C#_Entity Framework_Unit Testing_Moq - Fatal编程技术网

C# 如何验证已在模拟DbContext上调用RemoveRange?

C# 如何验证已在模拟DbContext上调用RemoveRange?,c#,entity-framework,unit-testing,moq,C#,Entity Framework,Unit Testing,Moq,我使用Moq测试在DbSet上调用RemoveRange的代码。我已经模拟了上下文对象和DbSet,但是当我尝试验证是否调用了RemoveRange时,我得到了“预期的模拟调用一次,但为0次”。我正在测试的方法有以下代码: IEnumerable<Thing> thingsToRemove = GetThingsToRemove(); DataContext.Things.RemoveRange(thingsToRemove); IEnumerable thingsToRemove

我使用Moq测试在
DbSet
上调用
RemoveRange
的代码。我已经模拟了上下文对象和
DbSet
,但是当我尝试验证是否调用了RemoveRange时,我得到了“预期的模拟调用一次,但为0次”。我正在测试的方法有以下代码:

IEnumerable<Thing> thingsToRemove = GetThingsToRemove();
DataContext.Things.RemoveRange(thingsToRemove);
IEnumerable thingsToRemove=GetThingsToRemove();
DataContext.Things.RemoveRange(thingsToRemove);
我的测试代码如下所示:

var mockContext = new Mock<MyDbContext>();
var mockThingSet = new Mock<DbSet<Thing>>();
var testData = new List<Thing>{new Thing{Id = 1, Name = "Test Thing"}};
mockThingSet.As<IQueryable<Thing>>().Setup(m => m.Provider).Returns(testData .Provider);
mockThingSet.As<IQueryable<Thing>>().Setup(m => m.Expression).Returns(testData.Expression);
mockThingSet.As<IQueryable<Thing>>().Setup(m => m.ElementType).Returns(testData.ElementType);
mockThingSet.As<IQueryable<Thing>>().Setup(m => m.GetEnumerator()).Returns(testData.GetEnumerator);
mockContext.Setup(c => c.Things).Returns(mockThingSet.Object);  
//call the method being tested, then....  
mockContext.Verify(c => c.Things.RemoveRange(It.IsAny<IEnumerable<Thing>>()), Times.Once);
var mockContext=new Mock();
var mockThingSet=new Mock();
var testData=newlist{newthing{Id=1,Name=“testthing”};
mockThingSet.As().Setup(m=>m.Provider).Returns(testData.Provider);
mockThingSet.As().Setup(m=>m.Expression).Returns(testData.Expression);
mockThingSet.As().Setup(m=>m.ElementType).Returns(testData.ElementType);
mockThingSet.As().Setup(m=>m.GetEnumerator()).Returns(testData.GetEnumerator);
Setup(c=>c.Things).Returns(mockThingSet.Object);
//调用正在测试的方法,然后。。。。
验证(c=>c.Things.RemoveRange(It.IsAny()),Times.Once);
我已经仔细检查了代码,并验证了1)调用
RemoveRange
的行被命中并且没有抛出异常,2)传递给
RemoveRange
的对象是
IEnumerable
。我还尝试在模拟的
DbSet
上调用
Verify
,但这也不起作用,因为调用是直接针对数据上下文进行的


为什么这不能证明?我如何验证它?

您需要在正确的模拟上调用
verify

mockThingSet.Verify(c => c.RemoveRange(It.IsAny<IEnumerable<Thing>>()), Times.Once);
mockThingSet.Verify(c=>c.RemoveRange(It.IsAny()),Times.Once);

他确实试过了,但没有成功。。问题:“我也尝试在模拟的DbSet上调用Verify,但这也不起作用”