2015-06-18 2 views
3

Имея следующий тест блока:Подделка вызова массива для конкретного индекса вызывает исключение

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). Возвраты (новый объект [] {4})'. –

+0

@CharlesMager: см. Мой комментарий под ответом Блэра. –

ответ

2

Проблема возникает из-за того, что Values не является индексом. Это свойство, которое возвращает массив.

Неконфигурированный Values вернет массив нулевой длины (поскольку массивы не подделываются). Вот что здесь происходит, и ()=>sut.Values[0] потерпит неудачу, если он когда-либо будет выполнен (что FakeItEasy не делает).

Так что реальный вынос здесь заключается в том, что с Values это массив, который не подделка (см. What can be faked?), нет способа выбрать FakeItEasy для возвращаемого значения для конкретного смещения. Лучшее, что можно сделать, это вернуть Values массив по вашему выбору, как предлагает @CharlesMager. Например:

var myArray = new object[100]; 
myArray[0] = 4; 
myArray[50] = 17; 
A.CallTo(() => sut.Values).Returns(myArray); 
+0

Хорошо, отлично, чтобы получить первый элемент массива. Но нарисуйте массив из 100 предметов, и я хочу настроить 50-е. –

+1

Один из вариантов: 'var myArray = новый объект [100]; myArray [50] = 17; A.CallTo (() => sut.Values) .Returns (myArray); ' –

+0

Кажется, это так. Думал, что будет свободный синтаксис, который мне не хватало. –

Смежные вопросы