2013-11-28 71 views
0

我想嘲笑Microsoft.Office.Interop.Excel.Range,之後可以獲取屬性Row(第一行範圍的索引) 。起訂量v 4.1.1309.1617/nunit.framework v 2.6.3.13283 在我的單元測試,我試圖建立模擬的行爲如下:設置屬性Row to Mocked Microsoft.Office.Interop.Excel.Range with Mock

var moqRowSelected = new Mock<Range>(); 
const int row = 1; 
moqRowSelected.SetupGet(x => x.Row).Returns(row); 
moqSheetBase.SetupProperty(x => x.RowSelected, moqRowSelected.Object); 

在代碼是單元測試中,我使用的範圍如下:

var iRow = PlanningSheet.RowSelected.Row; 
Range row = sheet.Rows[iRow]; 

當測試運行時,會產生以下異常:

Error: Missing method 'instance int32 [My.Example.Implementation.MyClass] Microsoft.Office.Interop.Excel.Range::get_Row()' from class 'Castle.Proxies.RangeProxy'.

我如何能實現這個成功的嘲諷?任何人都可以幫助我,謝謝。

回答

3

我想你已經正確地嘲笑因此iRow通過PlanningSheet.RowSelected引用的對象,應該是正確的。但是你沒有正確地嘲笑由sheet.Rows返回的範圍

讓我們重新編寫測試代碼如下

var iRow = PlanningSheet.RowSelected.Row; 
Range rows = sheet.Rows; 
Range row = rows.get_Range(iRow); 

我敢打賭,所包含的變量行模擬不包含get_Range()的實現,它是behing索引屬性的方法。

就個人而言,我避免了因爲嘲諷問題的索引屬性看 Mocking indexed property

所以這裏是,這似乎使你的情況嘲諷的代碼。請注意,我沒有獲得PlanningSheet的類型,所以我路過的屬性引用的對象RowSelected作爲方法的參數CodeUnderTest

private Range CodeUnderTest(Range rowSelected, Worksheet worksheet) 
    { 
     int index = rowSelected.Row; 
     var range = worksheet.Rows.get_Range(index); 
     return (Range) range; 

    } 

    [TestMethod] 
    public void MySampleTest() 
    { 
     var moqRowSelected = new Mock<Range>(); 
     const int row = 1; 
     moqRowSelected.SetupGet(x => x.Row).Returns(row); 

     var moqRows = new Mock<Range>(); 
     moqRows.Setup(x => x.get_Range(It.Is<object>((i) => (int) i==row),It.IsAny<object>())).Returns(moqRowSelected.Object); 

     var mockWorksheet = new Mock<Worksheet>(); 
     mockWorksheet.SetupGet(w => w.Rows).Returns(moqRows.Object); 

     var result = CodeUnderTest(moqRowSelected.Object, mockWorksheet.Object); 
     Assert.IsNotNull(result); 
    } 

最後你會發現,你必須提供所有的參數方法get_Range在模擬中。這是因爲如果你不這樣做,它不會編譯。錯誤很明顯表達式樹不能包含使用可選參數的調用或調用。

+0

對於僅在C#和.NET的_older_版本中使用表達式樹的索引器,這不是限制嗎?我已經使用了諸如'someMock.Setup(x => x [row])的東西,返回(whatever.Object);'如果我沒有記錯,就成功了。 –

+0

我發現的問題的來源,是我應該嘲笑任何使用Excel屬性或方法,即使它不是在將被測試。例如該方法:如果我使用這條線'newRow.Rows.AutoFit()'在另一種方法中,我應該嘲笑它,即使我不需要它將會被測試的方法。現在,我的問題是與嘲諷'sheet.Names.Add( 「D_」 + deal.Id, 「=」 + newRow.Address);'我怎麼能嘲笑它。 – user3045743

+0

如果它不在被測試的方法中,那麼_even是什麼意思?如果你指的是你的單元測試執行的方法,那麼你將不得不嘲笑一些生活在那裏的對象...... 我覺得你在嘲諷的困難來自於事實,你認爲這是一個嘲笑的對象。例如,在'newRow.Rows.Autofit()'你必須嘲笑方法'自動調整()'用於範圍實例返回訪問屬性'Rows'由變量'newRow'其也是嘲笑引用的對象時目的。總之,對於這條線,你至少需要兩次模擬。 –