Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将带[]的索引应用于类型为';Castle.proxy.RangeProxy';_C#_Excel_Unit Testing_Mocking_Moq - Fatal编程技术网

C# 无法将带[]的索引应用于类型为';Castle.proxy.RangeProxy';

C# 无法将带[]的索引应用于类型为';Castle.proxy.RangeProxy';,c#,excel,unit-testing,mocking,moq,C#,Excel,Unit Testing,Mocking,Moq,是什么导致此异常?我试图使用Moq模拟Microsoft.Office.Interop.Excel.Range。我想在其中嵌套另一个模拟的范围。但是当我尝试访问嵌套异常时,会抛出一个异常 例外情况 无法将带[]的索引应用于类型为的表达式 “城堡,代理,代理” 代码 [TestMethod] public void RangeProxyIndexTest() { // creating first range var cell1 = new Moq.Mock<Range>

是什么导致此异常?我试图使用
Moq
模拟
Microsoft.Office.Interop.Excel.Range
。我想在其中嵌套另一个模拟的
范围
。但是当我尝试访问嵌套异常时,会抛出一个异常

例外情况

无法将带[]的索引应用于类型为的表达式 “城堡,代理,代理”

代码

[TestMethod]
public void RangeProxyIndexTest()
{
    // creating first range
    var cell1 = new Moq.Mock<Range>();
    cell1.Setup(c => c.Value2).Returns("1");

    var range1Mock = new Moq.Mock<Range>();
    range1Mock.SetupGet(r => r[1, Moq.It.IsAny<Object>()]).Returns(cell1.Object);
    var range1 = range1Mock.Object;

    // creating second range
    var cell2 = new Moq.Mock<Range>();
    cell2.Setup(c => c.Value2).Returns("2");

    var range2Mock = new Moq.Mock<Range>();
    range2Mock.SetupGet(r => r[1, Moq.It.IsAny<Object>()]).Returns(cell2.Object);
    var range2 = range2Mock.Object;

    // merging both ranges into 1
    var range3Mock = new Moq.Mock<Range>();
    range3Mock.SetupGet(r => r[1, Moq.It.IsAny<Object>()]).Returns(range1);
    range3Mock.SetupGet(r => r[2, Moq.It.IsAny<Object>()]).Returns(range2);
    var range3 = range3Mock.Object;

    // testing succeeds
    Assert.AreEqual("1", range1[1].Value2);
    Assert.AreSame(range1, range3[1]);
    Assert.AreEqual("2", range2[1].Value2);
    Assert.AreSame(range2, range3[2]);

    // exceptions are thrown here
    Assert.AreEqual("1", range3[1][1].Value2);
    Assert.AreEqual("2", range3[2][1].Value2);
}
[TestMethod]
public void RangeProxyIndexTest()
{
//创建第一个范围
var cell1=新的最小起订量Mock();
单元格1.设置(c=>c.Value2).返回(“1”);
var range1Mock=new Moq.Mock();
range1Mock.SetupGet(r=>r[1,Moq.It.IsAny()).Returns(cell1.Object);
var range1=range1Mock.Object;
//创建第二个范围
var cell2=新的最小起订量Mock();
cell2.Setup(c=>c.Value2)。返回(“2”);
var range2Mock=new Moq.Mock();
range2Mock.SetupGet(r=>r[1,Moq.It.IsAny()).Returns(cell2.Object);
var range2=range2Mock.Object;
//将两个范围合并为1
var range3Mock=new Moq.Mock();
range3Mock.SetupGet(r=>r[1,Moq.It.IsAny()).Returns(range1);
range3Mock.SetupGet(r=>r[2,Moq.It.IsAny()).Returns(range2);
var range3=range3Mock.Object;
//测试成功
Assert.AreEqual(“1”,范围1[1].Value2);
Assert.AreName(范围1,范围3[1]);
Assert.AreEqual(“2”,范围2[1].Value2);
Assert.AreName(范围2,范围3[2]);
//这里抛出异常
Assert.AreEqual(“1”,范围3[1][1].Value2);
Assert.AreEqual(“2”,范围3[2][1].Value2);
}

尽管情况不同,但此异常的原因与

将验证部分更改为:

Assert.AreEqual("1", (range3[1] as Range)[1].Value2);
Assert.AreEqual("2", (range3[2] as Range)[1].Value2);

有关更多信息,请阅读

尽管情况不同,但此异常的原因与

将验证部分更改为:

Assert.AreEqual("1", (range3[1] as Range)[1].Value2);
Assert.AreEqual("2", (range3[2] as Range)[1].Value2);

有关更多信息,请阅读

,可能是因为
range3
不是二维数组?@Rafalon
[]]
不是
c
中二维数组的语法(在
java
[]
中是二维数组)在
c
中是聚合索引器调用,这是OP问题的根源。。。第一个索引器返回动态类型,然后运行时绑定器无法计算第二个索引器。可能是因为
range3
不是二维数组?@Rafalon
[]
不是
c#
中二维数组的语法(在
java
[]
中是二维数组)在
c#
中,它是一个聚合索引器调用,这是OP问题的根源。。。第一个索引器返回动态类型,然后运行时绑定器无法计算第二个索引器。