1 回答
TA贡献1712条经验 获得超3个赞
索引器Range
返回一个动态对象,这是您问题的根源。
Moq 用于Castle Dynamic proxy
生成假对象,Castle.Proxies.RangeProxy
在您的情况下是生成的类。由于此对象不是COM
对象,因此正在调用 C# 运行时绑定器的处理。运行时绑定器解析类型并寻找索引器方法,但他无法解析它,因为生成的类没有它。
解决您的最简单方法是将索引器结果返回到严格的Range
局部变量:
那么你的测试将失败,因为range.Rows[1]它等于row1......
因此,将您的测试代码更改为:
[TestMethod]
public void MockRowsTest()
{
var row1 = MockUtils.MockCells("test_row_1", "test_row_1");
var row2 = MockUtils.MockCells("test_row_2", "test_row_2");
var range = MockUtils.MockRows(row1, row2);
Assert.IsNotNull(range);
Assert.AreEqual(2, range.Count);
Assert.IsNotNull(range.Rows);
Assert.AreEqual(2, range.Rows.Count);
Range x = range.Rows[1];
Range y = range.Rows[2];
var xCell = x.Cells[1];
var yCell = y.Cells[1];
Assert.AreSame(row1, x);
Assert.AreSame(row2, y);
Assert.AreEqual("test_row_1", xCell.Value2);
Assert.AreEqual("test_row_2", yCell.Value2);
}
上面的UT会通过测试。IMO 你应该打破对“原子 OPS(多行)和方法”的聚合调用,而不是因为它会通过测试,因为它会使你的代码成为调试友好的代码。(我称之为“第 11 条规则”,你的代码从编写时起至少会再读 10 次......所以让编译器删除可传递的局部变量并使其成为调试友好的代码......)。
顺便提一句; 你也可以这样做:
Range x = range.Rows[1].Cells;
var str = x[1].Value2;
- 1 回答
- 0 关注
- 151 浏览
添加回答
举报