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

时间:2017-08-26 02:05:05

标签: c# garbage-collection nunit teamcity dotcover

我编写了一些类似下面的代码,用于测试C#终结器方法的实现。

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

如果启用JetBrains dotCover .NET Coverage工具,测试将失败。

如果我禁用.NET Coverage,则测试通过。

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");
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我仍然不明白发生了什么,但我能够解决问题,并使用immediately-invoked function expression让测试通过。

测试方法现在看起来像这样:

all: $(targets)

如果我将[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"); } } } 替换为new Action(() => { new Disposable(win32); })();new Disposable(win32);

,则测试失败