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

5

有以下单元测试:

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)

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

2
为什么不伪造数组? A.CallTo(() => sut.Values).Returns(new object[]{4}). - Charles Mager
@CharlesMager:请看我在Blair的回答下面的评论。 - Stécy
1个回答

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

好的,获取数组的第一个项目没问题。但是想象一下有100个项目的数组,我想配置第50个。 - Stécy
1
一个选项是var myArray = new object[100]; myArray[50] = 17; A.CallTo(() => sut.Values).Returns(myArray); - Blair Conrad
看起来是这样。我以为可能有我没掌握的流畅语法。 - Stécy
1
请查看更新后的答案,了解有关FakeItEasy无法处理数组的更多信息,因为它们无法伪造。我应该之前就想到这个问题。 - Blair Conrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接