伪造对特定索引的数组的调用会引发异常

Sté*_*écy 5 c# fakeiteasy

有以下单元测试:

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));
}
Run Code Online (Sandbox Code Playgroud)

导致以下异常:

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)
Run Code Online (Sandbox Code Playgroud)

或者也许我不知道如何为索引器指定一个假的?

Bla*_*rad 4

问题源于它Values不是索引器。它是一个返回数组的属性。

未配置的Values将返回零长度数组(因为数组不可伪造)。这就是这里发生的情况,()=>sut.Values[0]如果执行它就会失败(FakeItEasy 不会这样做)。

因此,这里真正的要点是,由于Values是一个不可伪造的数组(请参阅什么可以伪造?),因此无法让 FakeItEasy 为特定偏移量选择返回值。最好的办法是返回Values一个您选择的数组,正如 @CharlesMager 所建议的那样。例如:

var myArray = new object[100];
myArray[0] = 4;
myArray[50] = 17;
A.CallTo(() => sut.Values).Returns(myArray);
Run Code Online (Sandbox Code Playgroud)