1 回答

TA貢獻1712條經驗 獲得超3個贊
索引器Range
返回一個動態(tài)對象,這是您問題的根源。
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 條規(guī)則”,你的代碼從編寫時起至少會再讀 10 次......所以讓編譯器刪除可傳遞的局部變量并使其成為調試友好的代碼......)。
順便提一句; 你也可以這樣做:
Range x = range.Rows[1].Cells;
var str = x[1].Value2;
- 1 回答
- 0 關注
- 194 瀏覽
添加回答
舉報