У смоделированного объекта не все свойства отображаются в Intellisense - в одном проекте, но имеют их в другом - PullRequest
1 голос
/ 22 марта 2012

Я издеваюсь над объектами VSTO, и в одном проекте (я не писал) он имеет такой код:

var listOfSheets = new List<Worksheet>();
var mockSheets = Substitute.For<Sheets>();
mockSheets.Count.Returns(listOfSheets.Count);

Подсказка Intellisense для mockSheets показывает 6 свойств:

NSubstitute All Properties

В этом проекте работает линия с точкой останова.

Однако у меня тот же код в другом проекте (те же ссылки, пространства имен и т. Д.), Но подсказка Intellisense для mockSheets показывает только 1 свойство:

NSubstitute Only one Property

Я знаю, что это основная причина, которую я пытаюсь решить, но, к сожалению, настоящая проблема:

Невозможно выполнить привязку во время выполнения для пустой ссылки

Cannot perform runtime binding on a null reference

EDIT:

Объект листа высмеивается:

public static Worksheet Sheet
{
    get
    {
        var mockSheet = Substitute.For<Worksheet>();
        mockSheet.Name = MockSheetName;
        mockSheet.Visible = XlSheetVisibility.xlSheetVisible;

        return mockSheet;
    }
}

public static Workbook Workbook()
{
    return Workbook(1);
}

Ответы [ 4 ]

1 голос
/ 21 августа 2012

Это напоминание для меня каждый раз, когда я пишу Nsubstitute Excel Unit Tests.Я боролся с этой ошибкой слишком много раз.

Вы получите ошибку: Невозможно выполнить привязку во время выполнения для нулевой ссылки

Когда выссылаясь на библиотеку объектов .Net Excel, вы ДОЛЖНЫ ссылаться на библиотеку объектов COM Microsoft Excel 14.0.После того, как ссылка COM DLL взаимодействия Interop сделана, нажмите F4, чтобы увидеть свойства DLL, не забудьте установить COM Interop NOT для вставки типов взаимодействия.

.Excel Вот рабочий файл проекта:

<ItemGroup>
    <Reference Include="Microsoft.Office.Interop.Excel.Extensions">
      <HintPath>..\..\Refs\Microsoft.Office.Interop.Excel.Extensions.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
    <Reference Include="NSubstitute">
      <HintPath>..\..\Refs\NSubstitute.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Core">
      <RequiredTargetFramework>3.5</RequiredTargetFramework>
    </Reference>
    <Reference Include="System.Data" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="System.Runtime.Serialization" />
    <Reference Include="System.Xml" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="UIAutomationProvider" />
    <Reference Include="VSTOContrib.Core, Version=0.9.0.52, Culture=neutral, processorArchitecture=MSIL" />
    <Reference Include="WindowsBase" />
    <Reference Include="WindowsFormsIntegration" />
  </ItemGroup>
  <ItemGroup>
    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
      <Visible>False</Visible>
    </CodeAnalysisDependentAssemblyPaths>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="MockFactory.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="UnitTests.cs" />
  </ItemGroup>
  <ItemGroup>
      <COMReference Include="Microsoft.Office.Core">
      <Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
      <VersionMajor>2</VersionMajor>
      <VersionMinor>4</VersionMinor>
      <Lcid>0</Lcid>
      <WrapperTool>primary</WrapperTool>
      <Isolated>False</Isolated>
    </COMReference>
    <COMReference Include="Microsoft.Office.Interop.Excel">
      <Guid>{00020813-0000-0000-C000-000000000046}</Guid>
      <VersionMajor>1</VersionMajor>
      <VersionMinor>6</VersionMinor>
      <Lcid>0</Lcid>
      <WrapperTool>primary</WrapperTool>
      <Isolated>False</Isolated>
    </COMReference>
  </ItemGroup>

Преступник - это ссылка .Net Interop (должна быть ссылкой COM):

<Reference Include="Microsoft.Office.Interop.Excel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
  <EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
1 голос
/ 23 марта 2012

Немного истории:

Я получил проблему компиляции с этими ошибками:

1.Предопределенный тип 'Microsoft.CSharp.RuntimeBinder.Binder'не определено или не импортировано
2. Один или несколько типов, необходимых для компиляции динамического выражения, не найдены.Вам не хватает ссылок на Microsoft.CSharp.dll и System.Core.dll?

Поэтому я нашел эту статью и сослался на библиотеку Microsoft.CSharp: C # 4.0 и .Net 3.5

К моменту: Класс, который я показывал, по сути, Mocks объектную модель Excel, и я скопировал этот класс из одного проекта в другой (я не могу ссылаться на другойпроект как его фактически отдельный проект, плюс он вызвал бы циклическую зависимость) Я обнаружил, что метод расширения Returns был указан в intellisense, но я получил «Не удалось разрешить символ» при компиляции.Хотя посещение Определения было одинаковым в обоих классах / проектах.Чтобы обойти это изначально, я выполнил закомментированные строки:

public static Range Cell
{
    get
    {
        var mockCell = Substitute.For<Range>();
        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 фактически позволило успешно разрешить метод расширения Returns.Затем я обнаружил, что удаление Microsoft.CSharp dll решило мою проблему , все просто сработало, объект mockSheet имеет все свои свойства и мог успешно выполняться без ошибки «Невозможно выполнить привязку во время выполнения для пустой ссылки».

Да, и совет для всех типов насмешек, будьте особенно внимательны, чтобы установить это:

enter image description here

1 голос
/ 23 марта 2012

Возможно, причина в следующем:

Специфический проект 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 (я полагаю) и, возможно, другие ссылки.

Таким образом, исключение на самом деле не относится к значению Null, возвращаемому фиктивным объектом, а скорее к исключению нулевого связывания, вызванному невозможностью загрузить библиотеку CSharp .NET 4.0.

Поэтому, как вы обнаружили, решение состоит в том, чтобы удалить ссылку .net 4.0 Csharp. Возможно, в этом нет необходимости устанавливать проект под .net 3.5? Не уверен, что вам придется проверить, если какие-либо другие проблемы возникают. Но я думаю, лучше держать тестовые проекты на .net 4, если вы можете. Если кто-то не может указать, если это не лучшая практика.

1 голос
/ 22 марта 2012

Это неверное предположение, но массивы 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]);`
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...