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

Аудит и оптимизация QA-процессов
онлайн, начало 24 декабря
Автоматизация функционального тестирования
онлайн, начало 27 ноября
Логи как инструмент тестировщика
онлайн, начало 30 ноября
Тестирование REST API
онлайн, начало 30 ноября
Фотография

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 анонимных

Яндекс.Метрика
Реклама на портале