Windows服务的Moles VS2010单元测试失败

时间:2011-05-10 17:36:44

标签: unit-testing testing windows-services instrumentation moles

我正在编写一个相对较小且简单的Windows服务,并使用Moles来模拟单元测试。由于代码很小,我决定使用Moles工具,而不是使用存根来分割代码。当我对moled程序集执行任何单元测试时,我收到一个错误:

  

InitilaizationDetectsMissingMonitorDirectory   失败了:测试方法   FtpDirWatcher.Test.FileWatcherTest.InitilaizationDetectsMissingMonitorDirectory   抛出异常:   Microsoft.Moles.Framework.Moles.MoleInvalidOperationException:

     

Moles要求测试处于检测过程中。

     

在Visual Studio Test中,将以下属性添加到单元测试方法中:

     

[TestMethod的]

     

[HostType(“Moles”)] //添加此属性

     

公共无效   Test(){...}

我不确定“Moles是否需要测试 IN 一个检测过程。”请注意,“IN”表示这不是通常的“Moles要求测试是一个仪表化过程”。我回顾了文档,看看有没有遗漏的东西。我显然仍然缺少一些重要的东西。

目标程序集(“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);
        }
    }
}

任何帮助表示赞赏!

更新:添加了以下构建输出。包含上面代码中的位数设置,以表明它不应该是一个问题。

  

------ Rebuild All started:Project:Common,Configuration:Debug x86 ------

     

普通 - > C:... \共同\ BIN \ 86 \调试\ Common.dll

     

------ Rebuild All started:Project:FtpDirWatcher,Configuration:Debug x86 ------

     

FtpDirWatcher - > C:... \ FtpDirWatcher \ BIN \调试\ FtpDirWatcher.exe

     

------ Rebuild All started:Project:FtpDirWatcher.Test,Configuration:Debug 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 \ 86 \调试\ FtpDirWatcher.Test.dll   ==========重建全部:3成功,0失败,0跳过==========

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

这是一个完整的面掌解决方案。我意识到我正在使用放置在IDE代码窗口中的测试方法和类旁边的DevExpress Tools for Visual Studio 加载项字形(图标)来执行测试。 Moles安装程序会更改Visual Studio测试工具,以包含Moles主机适配器的参数和开关。但是,DevExpress没有被修改。

可能有两种解决方案:

  1. 直接使用Visual Studio测试工具直接执行Moles测试
  2. 修改Visual Studio的DevExpress工具以正确使用Moles主机
  3. 我的博客The Curly Brace: http://thecurlybrace.blogspot.com/2011/05/moles-requires-tests-to-be-in.html

    上有详细的概述和示例代码