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

标签 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));
}

导致以下异常:

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 不是索引器这一事实。 这是一个返回数组的属性。

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

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

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

关于c# - 为特定索引伪造对数组的调用会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30919514/

相关文章:

c# - ASP.NET - 复合控件 - 在 CreateChildControls 抑制 Button Click 事件后添加动态控件

unit-testing - 相当于 FakeItEasy 中 JustMock 的 ReturnsCollection() 吗?

c# - 使用 FakeItEasy,有没有办法伪造只写属性的 setter ?

c# - 从字符串数组中替换所有出现的字符串

C# Math.Sin() 和 Math.Log() 不准确

c# - 如何使用授权和客户端 ID 在 C# 中调用 Azure Maps API?

c# - Mock.Of<foo> 为带参数的方法调用设置返回值

mocking - 生成的服务模拟 : everything but RhinoMocks fails?

c# - FakeItEasy:在不指定类型的情况下伪造对泛型方法的调用

c# - 如何使用 xUnit、SubSpec 和 FakeItEasy 测试抛出的异常