我正在编写一个相对较小且简单的 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跳过=== =======