Moles VS2010 модульное тестирование Windows Service Fails - PullRequest
2 голосов
/ 10 мая 2011

Я пишу относительно небольшую и простую службу Windows и использую Moles для проверки юнит-тестов. Из-за небольшого кода я решил использовать инструментарий Moles, а не сегментировать код с заглушками. Когда я выполняю какой-либо модульный тест для смоделированной сборки, я получаю сообщение об ошибке:

InitilaizationDetectsMissingMonitorDirectory не удалось: метод теста FtpDirWatcher.Test.FileWatcherTest.InitilaizationDetectsMissingMonitorDirectory бросил исключение: Microsoft.Moles.Framework.Moles.MoleInvalidOperationException:

Кроты требуют, чтобы тесты были ВНУТРИ инструментального процесса.

В Visual Studio Test добавьте следующий атрибут вашего метода модульного теста:

[TestMethod]

[HostType ("Moles")] // добавить этот атрибут

публичная недействительность Test () {...}

Я не уверен, что это означает, что "Моль требует, чтобы тесты были IN инструментальным процессом". Обратите внимание, что «IN» означает, что это не обычное «Кроты требуют, чтобы тесты были инструментальным процессом». Я просмотрел документацию, чтобы узнать, что я пропустил. Очевидно, мне все еще не хватает чего-то важного.

Целевая сборка ("FtpDirWatcher") действительно оснащена Moles (о чем свидетельствует наличие объекта MFileWatcher), и у меня есть надлежащие атрибуты на месте в тестовом методе. Я даже пытался преобразовать целевое свойство в метод, но безрезультатно. Итак, что происходит?

Это сжатый код, так что никакой критики!

using System;
using System.IO;
using System.Linq;
using FtpDirWatcher.Moles;
using Microsoft.Moles.Framework;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[assembly: MolesAssemblySettings(Bitness = MolesBitness.AnyCPU)]

namespace .Test  // Test project namespace
{
    [TestClass]
    public class FileWatcherTest
    {
        readonly string _invalidDirectory = @"B:\invaliddirectory";

        [TestMethod]
        [DeploymentItem("FileWatcher.exe")]
        [HostType("Moles")]
        public void InitilaizationDetectsMissingMonitorDirectory()
        {
            Assert.IsFalse(Directory.Exists(_invalidDirectory));

            // THE FOLLOWING LINE OF CODE THROWS THE ERROR.
            // Use moles to detour the MonitorDirectory property's Get
            // method to a delegate.
            MFileWatcher.AllInstances.MonitorDirectoryGet = watcher => 
                new DirectoryInfo(_invalidDirectory);

            // Don't use the accessor -- no private fields are accessed.
            var target = new FileWatcher();
            Assert.IsFalse(target.IsConfigurationOk);
        }
    }
}

Любая помощь приветствуется!

ОБНОВЛЕНИЕ: Добавлен следующий вывод сборки. Включен параметр битности в код выше, чтобы показать, что это не должно быть проблемой.

------ Перестроить все запущено: Проект: Общий, Конфигурация: Отладка x86 ------

Общее -> C: ... \ Common \ bin \ x86 \ Debug \ Common.dll

------ Перестроить все началось: Проект: FtpDirWatcher, Конфигурация: Отладка x86 ------

FtpDirWatcher -> C: ... \ FtpDirWatcher \ bin \ Debug \ FtpDirWatcher.exe

------ Перестроить все началось: Проект: FtpDirWatcher.Test, Конфигурация: Отладка x86 ------

Microsoft Moles v0.94.51023.0 - http://research.microsoft.com/moles - .NET v4.0.30319

Авторские права (c) Microsoft Corporation 2007-2010. Все права защищены.

00: 00: 00.00> родинок

Moles : info : metadata : ignoring reference C:\...\FtpDirWatcher.Test\MolesAssemblies\FtpDirWatcher.Moles.dll

Moles : info : metadata : incompatible assembly bitness, using reflection only

Moles : info : metadata : loading C:\...\FtpDirWatcher\bin\Debug\FtpDirWatcher.exe (reflection only)

Moles : info : compilation : output assembly name: FtpDirWatcher.Moles

Moles : info : code : found 4 types

Moles : info : code : visibility: exported or assembly(FtpDirWatcher.Moles)

00:00:00.37> code generation

  Moles : info : code : generating code at C:\...\FtpDirWatcher.Test\obj\x86\Debug\Moles\befw\m.g.cs

  00:00:00.52> stubs generation

    Moles : info : code : generated 2 stub types

  00:00:00.89> moles generation

    Moles : info : code : generated 2 mole types

00:00:01.45> compiling

  Moles : info : compilation : Moles assembly: C:\...\FtpDirWatcher.Test\MolesAssemblies\FtpDirWatcher.Moles.dll

00: 00: 02.37> генератор молей 0 ошибок, 0 предупреждений

FtpDirWatcher.Test -> C: ... \ FtpDirWatcher.Test \ bin \ x86 \ Debug \ FtpDirWatcher.Test.dll ========== Перестроить все: 3 успешно, 0 не удалось, 0 пропущено ==========

Ответы [ 2 ]

1 голос
/ 03 июня 2011

Это полное решение для лица и ладони.Я понял, что выполняю тесты, используя DevExpress Инструменты для Visual Studio надстройки глифов (иконки), которые размещаются в окне кода IDE, рядом с методами и классами тестирования.Установщик Moles изменяет инструменты тестирования Visual Studio, включая параметры и переключатели для хост-адаптера Moles.Однако DevExpress не был изменен.

Возможны два решения:

  1. Просто выполняйте тесты Moles, используя инструменты тестирования Visual Studio напрямую
  2. Изменение DevExpress Tools for VisualStudio для правильного использования хоста Moles

Подробный обзор и пример кода есть в моем блоге The Curly Brace: http://thecurlybrace.blogspot.com/2011/05/moles-requires-tests-to-be-in.html

1 голос
/ 11 мая 2011

Попробуйте это: http://social.msdn.microsoft.com/Forums/en/pex/thread/176b2fc5-882e-413b-b4d5-10ea6b486e65

Вы используете x64?

...