第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何模擬 Excel VSTO 插件中的行?

如何模擬 Excel VSTO 插件中的行?

PHP
慕妹3242003 2021-06-29 18:43:08
我正在嘗試將一個模擬Range(包含帶有值的單元格)放在一個新的Range. 但是當我嘗試從 訪問特定元素時Range,會引發(fā)異常。我已經嘗試了一切,有沒有人知道我在這里做錯了什么?例外消息:測試方法 xxx.MockUtilsTest.MockRowsTest 拋出異常:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:無法將 [] 索引應用于“Castle.Proxies.RangeProxy”類型的表達式測試[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);    Assert.AreSame(row1, range.Rows[1].Cells[1]); // exception is thrown here    Assert.AreSame(row2, range.Rows[2].Cells[1]);    Assert.AreEqual("test_row_1", range.Rows[1].Cells[1].Value2);    Assert.AreEqual("test_row_2", range.Rows[2].Cells[1].Value2);}模擬工具public static Range MockCellValue2(Object value){    var cell = new Moq.Mock<Range>();    cell.Setup(c => c.Value2).Returns(value);    return cell.Object;}public static Range MockCells(params Object[] values){    var cells = new Moq.Mock<Range>();    for (int i = 0; i < values.Length; i++)    {        var cell = MockCellValue2(values[i]);        cells.SetupGet(c => c[i + 1, Moq.It.IsAny<Object>()]).Returns(cell);    }    var row = new Moq.Mock<Range>();    row.SetupGet(r => r.Cells).Returns(cells.Object);    row.SetupGet(r => r.Count).Returns(values.Length);    return row.Object;}public static Range MockRows(params Range[] rows){    var mergedRows = MergeRanges(rows);    var range = new Moq.Mock<Range>();    range.SetupGet(r => r.Count).Returns(rows.Length);    range.SetupGet(r => r.Rows).Returns(() => mergedRows);    range.Setup(r => r.GetEnumerator()).Returns(rows.GetEnumerator());    return range.Object;}
查看完整描述

1 回答

?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

索引器Range返回一個動態(tài)對象,這是您問題的根源。

http://img1.sycdn.imooc.com//60e01da30001f48c04010103.jpg

Moq 用于Castle Dynamic proxy生成假對象,Castle.Proxies.RangeProxy在您的情況下是生成的類。由于此對象不是COM對象,因此正在調用 C# 運行時綁定器的處理。運行時綁定器解析類型并尋找索引器方法,但他無法解析它,因為生成的類沒有它。

解決您的最簡單方法是將索引器結果返回到嚴格的Range局部變量:

http://img1.sycdn.imooc.com//60e01db00001e3c909320227.jpg

那么你的測試將失敗,因為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;


查看完整回答
反對 回復 2021-07-03
  • 1 回答
  • 0 關注
  • 194 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號