设置属性行与模拟Mocked Microsoft.Office.Interop.Excel.Range

我想嘲笑Microsoft.Office.Interop.Excel.Range和之后可以得到属性Row(第一行范围的索引)。 Moq v 4.1.1309.1617 / nunit.framework v 2.6.3.13283在我的unit testing中,我尝试设置模拟的行为如下:

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

在被unit testing的代码中,我使用Range如下:

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

testing运行时,会产生以下exception:

错误:类“Castle.Proxies.RangeProxy”中缺less方法'实例int32 [My.Example.Implementation.MyClass] Microsoft.Office.Interop.Excel.Range :: get_Row()'。

我怎样才能成功地实现这个嘲笑? 任何人都可以帮助我,谢谢。

我想你已经正确地嘲笑了由PlanningSheet.RowSelected引用的对象,因此iRow应该是正确的。 但是,您没有正确地模拟sheet.Rows返回的范围

让我们重写下面的testing代码

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

我敢打赌,包含在variables中的模拟不包含get_Range()的实现,它是beed索引属性的方法。

就我个人而言,由于嘲笑问题,我避免索引的财产见Mocking索引属性

所以这里是代码,似乎可以嘲笑你的情况。 请注意,我无法访问PlanningSheet的types,因此我将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 。 这是因为如果你不这样做,它不会编译。 错误是明确的expression式树不能包含使用可选参数的调用或调用