2

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

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

Moles 要求测试在仪表化过程中进行。

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

[测试方法]

[HostType("Moles")] // 添加这个属性

公共无效测试(){...}

我不确定“Moles 需要在仪表化过程中进行测试”是什么意思。请注意,“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);
        }
    }
}

任何帮助表示赞赏!

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

------ 重建所有开始:项目:通用,配置:调试 x86 ------

通用 -> C:...\Common\bin\x86\Debug\Common.dll

------ 重建所有开始:项目:FtpDirWatcher,配置:调试 x86 ------

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

------ 重建所有开始:项目:FtpDirWatcher.Test,配置:调试 x86 ------

微软鼹鼠 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跳过=== =======

4

2 回答 2

1

这是一个全面的面部解决方案。我意识到我正在通过使用位于 IDE 代码窗口中测试方法和类旁边的 DevExpress Tools for Visual Studio插件字形(图标)来执行测试。Moles 安装程序更改了 Visual Studio 测试工具,以包括 Moles 主机适配器的参数和开关。但是,DevExpress 没有被修改。

有两种可能的解决方案:

  1. 直接使用 Visual Studio 测试工具执行 Moles 测试
  2. 修改 DevExpress Tools for Visual Studio 以正确使用 Moles 主机

我的博客The Curly Brace上有详细的概述和示例代码:http://thecurlybrace.blogspot.com/2011/05/moles-requires-tests-to-be-in.html

于 2011-06-02T23:04:58.617 回答
1

试试这个: http ://social.msdn.microsoft.com/Forums/en/pex/thread/176b2fc5-882e-413b-b4d5-10ea6b486e65

你用的是 x64 吗?

于 2011-05-10T20:22:03.577 回答