Перейти к содержимому

Фотография

MSTest сборка имитаций не видит COM объекты


  • Авторизуйтесь для ответа в теме
В теме одно сообщение

#1 mishavin

mishavin

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Виноградов Михаил

Отправлено 09 октября 2015 - 06:25

Доброго времени суток!

 

Вот такой простейший код (показан ниже): мне нужно сделать заглушку для interface IGetMyVal.

Для этого создаю сборку имитаций. Сборка создается, но в ней куча ошибок. Причина - сборка не понимает, что такое Range.

 

Имя типа или пространства имен "Range" отсутствует в пространстве имен "ml1::Microsoft.Office.Interop.Excel" (пропущена ссылка на сборку?) [C:\Users\Admin\documents\visual studio 2013\Projects\MyLib1\UnitTestProject1\obj\Debug\Fakes\ml1\f.csproj] C:\Users\Admin\documents\visual studio 2013\Projects\MyLib1\UnitTestProject1\f.cs 100 117 UnitTestProject1

 

Причем в тестовом модуле ссылку на библиотеки Excel я сделал (Microsoft.Office.Core, Microsoft.Office.Interop.Excel ).

Чтобы ничего лишнего не генерировалось сделал настройку генерации:

 

  <Assembly Name="MyLib1"/>
  <StubGeneration>
    <Clear/>
    <Add Interfaces ="true"/>
  </StubGeneration>
  <ShimGeneration>
    <Clear/>
  </ShimGeneration>
</Fakes>

 

Т.е. у меня генерится только заглушка для интерфейса и ничего более.

 

Вопрос: никто с этим не сталкивался c тестированием, где используются COM объекты? Как избавиться от этой проблемы? 

Как сделать видимым Range? Исправить сгенерированный код я не могу. Он регенерится заново при каждом построении проекта.

 

Пытался задать это вопрос на других формах - тишина. Неужели я первый, кто пишет тест на MSTest, где встречаются COM объекты?  :sad:

 

 

using Excel = Microsoft.Office.Interop.Excel;


namespace MyLib1
{
    public interface IGetMyVal
    {
        string GetMyVal(Excel.Range rng, string startWith);
    }


    public class Class1
    {
        IGetMyVal _GetMyVal;
        public Class1(IGetMyVal GetMyVal)
        {
            _GetMyVal = GetMyVal;
        }


        public string GetStr(Excel.Range rng, string startWith)
        {
            return _GetMyVal.GetMyVal(rng, startWith);
        }
    }
}

  • 0

#2 mishavin

mishavin

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Виноградов Михаил

Отправлено 09 октября 2015 - 12:33

Решил.
Распишу подробнее для тех, кто с этим встретится.
 
План был такой - сгенерировать файл с заглушками и на базе него сделать свой, исправив ошибки.
 
При работе понял как управляется генерация при помощи файла fakes. Оказывается этот файл совсем не нужно удалять. Прямо в нем можно нужно указать что генерировать, а что нет, а при перестроении проекта сборка имитаций будет сама перегенерирована по новым правилам.
Так как мне нужна была только заглушка на интерфейс я сделал так:
 
  <Assembly Name="MyLib1"/>
  <StubGeneration>
    <Clear/>
    <Add Interfaces ="true"/>
  </StubGeneration>
  <ShimGeneration>
    <Clear/>
  </ShimGeneration>
</Fakes>
 
Т.е. я указал сделать заглушки на все интерфейсы, ну а так как он у меня один - то будет сделана заглушка на IGetMyVal.
 
После этого нужно взять сгенерированный код.
Для этого нужно встать на проект теста в проводнике решения и нажать кнопку "Показать все файлы" (вверху проводника).
После этого в каталоге obj\Debug\Fakes\ml1 нужно встать на файл f.cs и скопировать его содержимое.
 
ml1 - это alias, который дала для моей библиотеки MyLib1 система генерации кода. В Вашем случае будет другое.
 
После этого в сборке ТЕСТА нужно добавить пустой класс и скопировать в него содержимое из буфера клавиатуры (из f.cs).
 
Класс нужно создавать именно в сборке для теста. Если попытаться сделать отдельный модуль и в нем сделать класс (и сделать указатель на него в тестовой сборке), то получим ошибку компиляции о что-то типа "... тип не может работать через границы сборки..."
 
Теперь подправляем полученный класс. Нужно сделать следующее:
1. Закомментировать строки extern... и [assembly...
2. Удалить mqttf::  и ml1:: (Про наименование ml1 я уже писал выше). Ошибка заключается в том, что Range генератор кода помещает под ml1!
 
 
Все. Заглушка готова. Можно ей пользоваться!
 
Ах, да. Удалите файле MyLib1.fakes (имя_вашего_модуля.fakes) из каталога Fakes - это удалит генерацию кода сборки имитаций.

  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных