为特定索引伪造对数组的调用会引发异常
Faking a call to an array for a particular index raises an exception
进行以下单元测试:
public interface ITestMe
{
object[] Values { get; }
}
[Test]
public void Test ()
{
var sut = A.Fake<ITestMe> ();
A.CallTo (() => sut.Values[0]).Returns (4);
Assert.That (sut.Values[0], Is.EqualTo (4));
}
导致以下异常:
System.InvalidCastException : Unable to cast object of type 'System.Linq.Expressions.SimpleBinaryExpression' to type 'System.Linq.Expressions.InvocationExpression'.
at FakeItEasy.Expressions.CallExpressionParser.Parse(LambdaExpression callExpression)
at FakeItEasy.Configuration.FakeConfigurationManager.AssertThatMemberCanBeIntercepted(LambdaExpression callSpecification)
at FakeItEasy.Configuration.FakeConfigurationManager.CallTo(Expression1 callSpecification) at FakeItEasy.A.CallTo(Expression1 callSpecification)
或者我不知道如何为索引器指定伪造?
问题是因为 Values
不是索引器。
return 是一个数组 属性。
未配置的 Values
将 return 为零长度数组(因为数组不可伪造)。这就是这里发生的事情,如果执行过 ()=>sut.Values[0]
就会失败(FakeItEasy 不会这样做)。
所以这里真正的要点是因为 Values
是一个数组,它是不可伪造的(参见 What can be faked?),所以 FakeItEasy 无法为它选择一个 return 值一个特定的偏移量。正如@CharlesMager 建议的那样,可以做的最好的事情是让 Values
return 一个你选择的数组。例如:
var myArray = new object[100];
myArray[0] = 4;
myArray[50] = 17;
A.CallTo(() => sut.Values).Returns(myArray);
进行以下单元测试:
public interface ITestMe
{
object[] Values { get; }
}
[Test]
public void Test ()
{
var sut = A.Fake<ITestMe> ();
A.CallTo (() => sut.Values[0]).Returns (4);
Assert.That (sut.Values[0], Is.EqualTo (4));
}
导致以下异常:
System.InvalidCastException : Unable to cast object of type 'System.Linq.Expressions.SimpleBinaryExpression' to type 'System.Linq.Expressions.InvocationExpression'.
at FakeItEasy.Expressions.CallExpressionParser.Parse(LambdaExpression callExpression)
at FakeItEasy.Configuration.FakeConfigurationManager.AssertThatMemberCanBeIntercepted(LambdaExpression callSpecification)
at FakeItEasy.Configuration.FakeConfigurationManager.CallTo(Expression1 callSpecification) at FakeItEasy.A.CallTo(Expression1 callSpecification)
或者我不知道如何为索引器指定伪造?
问题是因为 Values
不是索引器。
return 是一个数组 属性。
未配置的 Values
将 return 为零长度数组(因为数组不可伪造)。这就是这里发生的事情,如果执行过 ()=>sut.Values[0]
就会失败(FakeItEasy 不会这样做)。
所以这里真正的要点是因为 Values
是一个数组,它是不可伪造的(参见 What can be faked?),所以 FakeItEasy 无法为它选择一个 return 值一个特定的偏移量。正如@CharlesMager 建议的那样,可以做的最好的事情是让 Values
return 一个你选择的数组。例如:
var myArray = new object[100];
myArray[0] = 4;
myArray[50] = 17;
A.CallTo(() => sut.Values).Returns(myArray);