模拟对象没有Intellisense中显示的所有属性 – 在一个项目中但在另一个项目中有它们

我在嘲笑VSTO对象,在一个项目中(我没写),它有这样的代码:

var listOfSheets = new List(); var mockSheets = Substitute.For(); mockSheets.Count.Returns(listOfSheets.Count); 

mockSheets的Intellisense ToolTip显示了6个属性:

NSubstitute所有属性

具有断点的线在此项目中起作用。

但是我在不同的项目中使用相同的代码(相同的引用,名称空间等),但是mockSheets的Intellisense ToolTip只显示1个属性:

NSubstitute只有一个属性

我知道这是我试图解决的根本原因,但实际问题是:

无法对空引用执行运行时绑定

无法对空引用执行运行时绑定

编辑:

Sheet对象被模拟:

 public static Worksheet Sheet { get { var mockSheet = Substitute.For(); mockSheet.Name = MockSheetName; mockSheet.Visible = XlSheetVisibility.xlSheetVisible; return mockSheet; } } public static Workbook Workbook() { return Workbook(1); } 

这是一个疯狂的猜测,但Office Interop数组是基于1,而不是基于0。 我没有调查它,但这可能在元数据中定义。 试试这个:

 for (int i = 0; i < numSheets; i++) { listOfSheets.Add(Sheet); listOfSheets[i].Name = MockSheetName + (i + 1); `mockSheets[i + 1].Returns(listOfSheets[i]);` } 

一些历史:

我遇到了这些错误的编译问题:

1.未定义或导入预定义类型“Microsoft.CSharp.RuntimeBinder.Binder”
2.无法找到编译动态表达式所需的一种或多种类型。 您是否缺少对Microsoft.CSharp.dll和System.Core.dll的引用?

所以我发现了这篇文章并引用了Microsoft.CSharp库: C#4.0和.Net 3.5

要点:我一直在展示Mocks Excel对象模型,我将这个类从一个项目复制到另一个项目(我不能将其他项目作为实际单独的项目加上它会导致循环依赖)我发现返回扩展方法在intellisense中列出,但在编译时我得到了“无法解析符号”。 即使在两个类/项目中定义相同也是如此。 为了解决这个问题,我最初做了注释:

 public static Range Cell { get { var mockCell = Substitute.For(); mockCell.Address.Returns("$A$1"); mockCell.Formula = "=1+1"; mockCell.ToString().Returns(mockCell.Formula.ToString()); //mockCell.ToString().Returns(info => mockCell.Formula.ToString()); //SubstituteExtensions.Returns(mockCell.ToString(), mockCell.Formula.ToString()); mockCell.Worksheet.Returns(Sheet); mockCell.Worksheet.Name.Returns(MockSheetName); return mockCell; } } 

这一点有点像红鲱鱼,但删除Microsoft.CSharp dll实际上允许Return扩展方法成功解析。 然后我发现删除Microsoft.CSharp dll解决了我的问题 ,一切正常,mockSheet对象具有其所有属性,并且能够成功执行而没有“无法对空引用执行运行时绑定”错误。

哦,以及任何人嘲笑互操作类型的提示,要特别注意设置:

在此处输入图像描述

听起来如下可能是原因:

VSTO特定项目待测(Addin / taskpane / etc)
VSTO ver:VSTO 3.0 SP1
.NET ver:.NET 3.5 SP1

VS 2010以上项目的测试项目
默认为
.NET Ver:.NET 4.0

这将在模拟对象时创建引用问题,因为测试项目期望能够使用MS.Csharp(我猜)和可能的其他引用。

因此,exception并不是真正引用模拟对象返回的Null值,而是由于无法加载.NET 4.0的CSharp库而导致的空绑定exception。

因此,您发现解决方案是删除.net 4.0 Csharp引用。 虽然将项目设置为在.net 3.5下运行,但这可能是不必要的? 不确定您是否必须测试是否出现任何其他问题。 但我想如果可以的话,最好将测试项目放在.net 4上。 除非有人能说明这不是最佳做法。

每次我写Nsubstitute Excelunit testing时,这都会提醒我自己。 我曾经多次与这个错误作斗争。

您将收到错误: 无法对空引用执行运行时绑定

当您参考.Net Excel对象库时,您必须引用COM Microsoft Excel 14.0对象库。 引用COM互操作Excel DLL后,单击F4以查看DLL属性,记住将COM Interop NOT设置为Embed Interop Types。

.Excel这是一个有效的项目文件:

   ..\..\Refs\Microsoft.Office.Interop.Excel.Extensions.dll    ..\..\Refs\NSubstitute.dll    3.5              False          {2DF8D04C-5BFA-101B-BDE5-00AA0044DE52} 2 4 0 primary False   {00020813-0000-0000-C000-000000000046} 1 6 0 primary False   

罪犯是这个.Net Interop引用(需要是COM参考):

  True