Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибки сборки иммитаций MSTest с Excel, как устранить ошибки при создании сборки 
:(
    Опции темы
vinvin1
Дата 7.10.2015, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.3.2007

Репутация: нет
Всего: нет



Для примера использую такой код, который нужно протестировать.
Использую MSTest.
Мне нужно создать заглушку для метода IGetMyVal.GetMyVal.

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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);
        }
    }

    public class Class2 : IGetMyVal
    {
        public string GetMyVal(Excel.Range rng, string startWith)
        {
            // добавляем маску для поиска, если ее нет
            startWith = startWith.EndsWith("*") ? startWith : startWith + "*";

            Excel.Range foundRng = rng.Find(startWith);
            if (foundRng != null)
                return foundRng.Value.ToString();
            else
                return "";
        }
    }
}




Проблема в том, что когда я создаю сборку имитаций, то в ней оказывается много ошибок. Ругается на то, что тип Range не определен.
Это одна ошибка. Но почему не определен - непонятно! Указатели на Excel я в тестовый модуль добавил.

В журнале MyLib1.Fakes.messages пишет: 
c:\Users\Admin\Documents\Visual Studio 2013\Projects\MyLib1\UnitTestProject1\Fakes\MyLib1.fakes : warning : Невозможно создать заглушку для Microsoft.Office.Interop.Excel.Range: тип создан компилятором.

Это и понятно. Но мне и не нужна заглушка для Range. Но как заставить MSTest не генерить для Range заглушек и оболочек?

В MSDN читал "Формирование и компиляция кода, а также соглашения об именовании в Microsoft Fakes"

Там есть описание как в файле fakes указать не генерить заглушки и оболочки, НО для генерации новой сборки имитаций я должен сначала удалить старый fakes файл!
Да, но там же я дал указания генератору - что не нужно генерить!!!!!

Короче круг замкнулся.  Бьюсь с этим уже тритий день.  smile 


Это сообщение отредактировал(а) vinvin1 - 7.10.2015, 16:41
PM MAIL   Вверх
vinvin1
Дата 9.10.2015, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.3.2007

Репутация: нет
Всего: нет



Решил.
Распишу подробнее для тех, кто с этим встретится.

План был такой - сгенерировать файл с заглушками и на базе него сделать свой, исправив ошибки.

При работе понял как управляется генерация при помощи файла fakes. Оказывается этот файл совсем не нужно удалять. Прямо в нем можно нужно указать что генерировать, а что нет, а при перестроении проекта сборка имитаций будет сама перегенерирована по новым правилам.
Так как мне нужна была только заглушка на интерфейс я сделал так:

<Fakes xmlns="http://schemas.micro...m/fakes/2011/">
  <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 - это удалит генерацию кода сборки имитаций.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0651 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.