你如何使用 NSubstitute 模拟 IEnumerable<T> ElementAt()?
How do you mock IEnumerable<T> ElementAt() using NSubstitute?
我一直在实施正确的技术来模拟 IEnumerable 的 Linq 方法时遇到问题。
{
var qs = Substitute.For<IEnumerable<object>>();
qs.ElementAt(i).Returns(q);
qs.Count().Returns(i);
}
这是为了测试一种方法,它包括随机或以受控方式从列表中拉出一个项目。
private IEnumerable<T> list;
async object Save(object obj, byte i = 0)
{
var random = new Random();
var index = i == 0 ? random.Next(0, list.Count()) : i;
return list.ElementAt(index);
}
这样做会导致:
at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
at System.Collections.Generic.List`1.get_Item(Int32 index)
at System.Linq.Enumerable.ElementAt[TSource](IEnumerable`1 source, Int32 index)
at King.Azure.Unit.Test.Data.StorageQueueShardsTests.<Save>d__11.MoveNext() in C:\Users\jefkin\Documents\GitHub\King.Azure\King.Azure.Unit.Test\Data\StorageQueueShardsTests.cs:line 127
--- End of stack trace from previous location where exception was thrown ---
at NUnit.Framework.Internal.AsyncInvocationRegion.AsyncTaskInvocationRegion.WaitForPendingOperationsToComplete(Object invocationResult)
at NUnit.Framework.Internal.Commands.TestMethodCommand.RunAsyncTestMethod(TestExecutionContext context)
Result Message:
System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
唯一可以模拟的方法是来自 类 的接口方法或虚拟方法。
因为 ElementAt
是一个扩展方法而不是 IEnumerable<T>
方法,所以它不能被模拟。
最好的测试方法是使用 List<T>
并相应地设置列表而不是使用 NSubstitute。
例如:
var qs = new List<object> {
obj1,
obj2,
obj3
};
var result = sut.Save(obj, i);
var expected = qs[i];
Assert.Equal(expected, result);
我一直在实施正确的技术来模拟 IEnumerable 的 Linq 方法时遇到问题。
{
var qs = Substitute.For<IEnumerable<object>>();
qs.ElementAt(i).Returns(q);
qs.Count().Returns(i);
}
这是为了测试一种方法,它包括随机或以受控方式从列表中拉出一个项目。
private IEnumerable<T> list;
async object Save(object obj, byte i = 0)
{
var random = new Random();
var index = i == 0 ? random.Next(0, list.Count()) : i;
return list.ElementAt(index);
}
这样做会导致:
at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
at System.Collections.Generic.List`1.get_Item(Int32 index)
at System.Linq.Enumerable.ElementAt[TSource](IEnumerable`1 source, Int32 index)
at King.Azure.Unit.Test.Data.StorageQueueShardsTests.<Save>d__11.MoveNext() in C:\Users\jefkin\Documents\GitHub\King.Azure\King.Azure.Unit.Test\Data\StorageQueueShardsTests.cs:line 127
--- End of stack trace from previous location where exception was thrown ---
at NUnit.Framework.Internal.AsyncInvocationRegion.AsyncTaskInvocationRegion.WaitForPendingOperationsToComplete(Object invocationResult)
at NUnit.Framework.Internal.Commands.TestMethodCommand.RunAsyncTestMethod(TestExecutionContext context)
Result Message:
System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
唯一可以模拟的方法是来自 类 的接口方法或虚拟方法。
因为 ElementAt
是一个扩展方法而不是 IEnumerable<T>
方法,所以它不能被模拟。
最好的测试方法是使用 List<T>
并相应地设置列表而不是使用 NSubstitute。
例如:
var qs = new List<object> {
obj1,
obj2,
obj3
};
var result = sut.Save(obj, i);
var expected = qs[i];
Assert.Equal(expected, result);