Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么启用JetBrains dotCover会导致NUnit测试失败?_C#_Garbage Collection_Nunit_Teamcity_Dotcover - Fatal编程技术网

C# 为什么启用JetBrains dotCover会导致NUnit测试失败?

C# 为什么启用JetBrains dotCover会导致NUnit测试失败?,c#,garbage-collection,nunit,teamcity,dotcover,C#,Garbage Collection,Nunit,Teamcity,Dotcover,我编写了如下代码,对C#finalizer方法的实现进行单元测试 在TeamCity 2017.1.3版中,我使用NUnit runner类型的构建步骤,使用NUnit.ConsoleRunner.3.7.0运行此测试 如果启用JetBrains dotCover.NET覆盖率工具,测试将失败 如果禁用.NET覆盖率,测试将通过 dotCover可能会做些什么来影响测试结果 using System; using System.Threading; using NUnit.Framework;

我编写了如下代码,对C#finalizer方法的实现进行单元测试

在TeamCity 2017.1.3版中,我使用NUnit runner类型的构建步骤,使用NUnit.ConsoleRunner.3.7.0运行此测试

如果启用JetBrains dotCover.NET覆盖率工具,测试将失败

如果禁用.NET覆盖率,测试将通过

dotCover可能会做些什么来影响测试结果

using System;
using System.Threading;
using NUnit.Framework;
using Telerik.JustMock;

namespace MyNamespace
{
    public interface IWin32Api
    {
        void FreeResource();
    }

    public class Disposable
    {
        private readonly IWin32Api _win32;

        public Disposable(IWin32Api win32)
        {
            _win32 = win32;
        }

        ~Disposable()
        {
            _win32.FreeResource();
        }
    }

    [TestFixture]
    public class TestFixture
    {
        [Test]
        public void Test()
        {
            using (var signal = new ManualResetEvent(false))
            {
                var win32 = Mock.Create<IWin32Api>();

                Mock.Arrange(() => win32.FreeResource())
                    .DoInstead(() => { signal.Set(); });

                var subjectUnderTest = new Disposable(win32);

                subjectUnderTest = null;

                GC.Collect();

                if (!signal.WaitOne(TimeSpan.FromMinutes(1)))
                {
                    Assert.Fail("IWin32Api.FreeResource never called");
                }
            }
        }
    }
}
使用系统;
使用系统线程;
使用NUnit.Framework;
使用Telerik.JustMock;
名称空间MyNamespace
{
公共接口IWin32Api
{
void FreeResource();
}
公厕
{
专用只读IWin32Api_win32;
公共一次性(IWin32Api win32)
{
_win32=win32;
}
~一次性的()
{
_win32.FreeResource();
}
}
[测试夹具]
公共类测试夹具
{
[测试]
公开无效测试()
{
使用(var信号=新手动复位事件(错误))
{
var win32=Mock.Create();
Mock.Arrange(()=>win32.FreeResource())
.DoInstead(()=>{signal.Set();});
var subjectiondertest=新的一次性(win32);
subjectUnderTest=null;
GC.Collect();
如果(!signal.WaitOne(TimeSpan.FromMinutes(1)))
{
Assert.Fail(“IWin32Api.FreeResource从未调用”);
}
}
}
}
}

我仍然不明白发生了什么,但我能够通过使用一个测试来解决问题并通过测试

现在的测试方法如下所示:

[Test]
public void Test()
{
    using (var signal = new ManualResetEvent(false))
    {
        var win32 = Mock.Create<IWin32Api>();

        Mock.Arrange(() => win32.FreeResource())
            .DoInstead(() => { signal.Set(); });

        new Action(() => { new Disposable(win32); })();

        GC.Collect();

        GC.WaitForPendingFinalizers();

        if (!signal.WaitOne(TimeSpan.FromMinutes(1)))
        {
            Assert.Fail("IWin32Api.FreeResource never called");
        }
    }
}
[测试]
公开无效测试()
{
使用(var信号=新手动复位事件(错误))
{
var win32=Mock.Create();
Mock.Arrange(()=>win32.FreeResource())
.DoInstead(()=>{signal.Set();});
新操作(()=>{new Disposable(win32);})();
GC.Collect();
GC.WaitForPendingFinalizers();
如果(!signal.WaitOne(TimeSpan.FromMinutes(1)))
{
Assert.Fail(“IWin32Api.FreeResource从未调用”);
}
}
}

如果我替换
新操作(()=>{new Disposable(win32);})(),测试将失败带有
新的一次性(win32)或带有
var d=new-Disposable(win32);d=零

我不确定JustMock的具体内容。但您是否注意到有x86和x64版本的DotCover?也许这就是问题所在。好建议。不幸的是,我尝试了x86和x64,症状是一样的。我注意到Dotcolve运行可执行文件。当我关闭代码覆盖率时,只运行
nunit3 console.exe
<代码>nunit agent.exe
未运行。
nunit agent.exe
是否与垃圾收集期间未运行终结器有关?谢谢!我仍然浪费了一个小时,因为我没有意识到问题是由dotCover引起的,但至少我已经准备好了解决方案!:)