测试方法不确定:未运行测试。错误?

Posted

技术标签:

【中文标题】测试方法不确定:未运行测试。错误?【英文标题】:Test method is inconclusive: Test wasn't run. Error? 【发布时间】:2013-08-21 02:10:59 【问题描述】:

我有一个测试类,下面我发布了一个测试类的示例测试

namespace AdminPortal.Tests.Controller_Test.Customer

    [TestClass]
    public class BusinessUnitControllerTests
    
        private IBusinessUnitRepository _mockBusinessUnitRepository;
        private BusinessUnitController _controller;

        [TestInitialize]
        public void TestInitialize()
        
            _mockBusinessUnitRepository = MockRepository.GenerateMock<IBusinessUnitRepository>();
            _controller = new BusinessUnitController(_mockBusinessUnitRepository);
        

        [TestCleanup]
        public void TestCleanup()
        
            _mockBusinessUnitRepository = null;

            _controller.Dispose();
            _controller = null;

        

        #region Index Action Tests
        [TestMethod]
        public void Index_Action_Calls_GetAllBusinessUnit()
        
            _mockBusinessUnitRepository.Stub(x => x.GetAllBusinessUnit());

            _controller.Index();

            _mockBusinessUnitRepository.AssertWasCalled(x=>x.GetAllBusinessUnit());
        
    

当我运行项目时,我得到以下屏幕

我检查了引用,测试项目有对主项目的引用。 知道为什么测试没有运行或说它们没有结论吗?

编辑 1:

我看到了一个帖子 here 并将我的测试设置的默认处理器架构更改为 X64,但它仍然不起作用。

【问题讨论】:

这是 ReSharper 中的一个已知问题。这里有一些潜在的解决方案:***.com/questions/12191352/…. 您是否进行了清理和重建?我记得在 VS2010 中有一些奇怪之处,在您更新和重建程序集后会丢失对它们的引用。 @ChrisMantle 我检查了它并更改了我的默认处理器架构,但它仍然不起作用 @MarkWalsh 我正在使用 VS2012。我仍然按照你说的清理并重建了解决方案,但仍然无法正常工作 这个问题是discussed at meta 【参考方案1】:

对于仍然无法解决问题的用户,请在管理 Nuget 包时查看Consolidate 标签。

原来我们的单元测试项目引用了一个不同的版本,导致了这个完全模糊的错误。

【讨论】:

【参考方案2】:

我遇到了完全相同的问题,但没有任何帮助。

最终我发现我的单元项目和单元测试项目的命名空间不匹配。

我的单元项目的命名空间是unit.project,测试项目名为unit.project.tests,但测试的默认命名空间与单元相同,都是unit.project。

一旦我将命名空间更新为不同的(每个项目一个命名空间),一切正常!

【讨论】:

是的,我遇到了同样的问题。这个想法可能是为了便于访问,使测试项目和目标项目相同,但它与测试运行程序有关,并从 OP 产生这个问题。【参考方案3】:

对我来说,一个测试造成了这个错误,结果我无意中跳过了测试。在屏幕左侧,您单击放置断点的位置,您可能会注意到您的测试被设置为跳过(有一个微软图标表示这一点)。我启用了测试,错误消失了。

【讨论】:

【参考方案4】:

非常奇怪的行为。

刚刚将最近添加到 app.config 底部的新 appsetting 条目移至解决了我的问题。

<appSettings>
    <add key="xxxxxx" value="xxxxx" />
</appSettings>

希望这对某人有所帮助

【讨论】:

节点不得放在 节点上方 app.config 中的完全混乱对我造成了影响【参考方案5】:

就我而言,我从我的 unittestproject 中引用了 2 个项目。两个引用的项目都使用了同名但版本不同的 dll。

我在 Visual Studio 中没有注意到这一点。我注意到 Eventviewer 中的错误。

为了解决这个问题,我在 unittestproject 的 app.config 中使用了bindingRedirect 来修复 dll 版本。

【讨论】:

【参考方案6】:

在我的情况下,发现 TestCaseSource 的参数数量与测试方法中的参数不同。

[Test, TestCaseSource("DivideCases")]
public void DivideTest(int n, int d, int q)

    Assert.AreEqual( q, n / d );


static object[] DivideCases =

    new object[]  12, 3 ,
    new object[]  12, 2 ,
    new object[]  12, 4  
;

这里 DivideCases 中的每个对象数组都有两个项目,应该是 3 因为 DivideTest 方法有 3 个参数。

【讨论】:

我在直接使用测试用例而不是测试用例源时遇到了类似的问题。最终结果是相同的——测试签名中的参数数量与 TestCase 属性中的值不匹配会导致结果不确定。【参考方案7】:

在一些代码更改后(它们之前通过了),我的班级的所有测试都变得不确定。

我似乎在我的测试类中添加了一个新字段:

private readonly Foo _foo = CreateFoo();

问题是在“CreateFoo()”内部抛出了一个异常,所以它发生在所有测试中,而不是失败,它们都变得不确定。

【讨论】:

【参考方案8】:

就我而言,ReSharper 在测试窗口中给了我这个额外的异常:

2017.06.15 12:56:57.621   ERROR Exploration failed with the exception:
System.AggregateException: One or more errors occurred. ---> System.Threading.Tasks.TaskCanceledException: A task was canceled.
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at JetBrains.ReSharper.UnitTestFramework.Launch.Stages.DiscoveryStage.Run(CancellationToken token)
---> (Inner Exception #0) System.Threading.Tasks.TaskCanceledException: A task was canceled.<---

最终导致出现此错误的测试项目都没有在配置管理器中设置为构建。选中复选框以构建 2 个测试项目并为我排序。

【讨论】:

【参考方案9】:

我知道这个问题有 /several/ 的答案,但我还有另一个独特的答案,我还没有将其视为解决它的方法。我希望这对其他人有帮助。

要使用单元测试会话,一个外部依赖项是 Microsoft.Net.Test.Sdk,在 VS 管道中的某个时间点,xunit.runner.visualstudio 停止为测试运行器的 ReSharper 单元测试会话风格正常工作。以下是我如何解决这个问题,以及我是如何解决的。

我的问题和答案源于在将我的一些 net451 库转换为 netStandard 2.0 以允许我的团队在 Core 或 Framework 中进行开发时看到 Inconclusive。当我进入新完成的 netStandard2.0 库并开始将他们的旧单元测试项目转换为新解决方案时,我遇到了问题。您无法在 net Standard 项目中运行单元测试,因此我选择将单元测试项目降级为 net472。

在这一点上,我要注意,.csproj 文件自 .net Framework 以来已经发生了变化。为了干净地与 nupkg 文件和 .net 标准库的构建包集成,您需要更改要使用 PackageReference 而不是 packages.config 处理的引用。

我有一些与 Windows 耦合的库无法转换为 netStandard,因此在更新它们的依赖项以使用新的 netStandard 库时,我意识到如果它们的 .csproj 文件位于旧版本中,dotnet pack 命令将失败格式。为了解决这个问题,不仅需要将它们从 packages.config 转换为 PackageReference,我还必须手动将 .csproj 文件更新为较新的 VS2017 格式。这允许这些库作为引用 netStandard2.0 依赖项的 net472 库干净地构建到 nuget 包中。

有一个工具可以为你转换包组织行为,它保留了旧的 .csproj 样式并使用 .csproj 中的 PackageReference。由于上述原因,我养成了手动将 .csproj 样式迁移到 VS2017 格式的习惯。

总之,当我将 PackageReference 用于我的依赖项并且我的单元测试项目 .csproj 文件采用 VS2017 样式时,我收到了 Inconclusive。

我能够通过删除我的项目来解决这个问题,完全按照 net472 中的方式重新创建它,而不是将其转换为 VS2017 .csproj 格式,而是将其保留为旧格式。

无论出于何种原因,旧格式都允许我的测试会话完成。

我对几件事感到好奇:

    如果很多有此问题的人在默认情况下 .csproj 文件采用新格式的 netCore 版本中遇到此问题。 如果人们能够通过除我的可重现问题/修复之外的其他方式解决问题,是使用 netCore 版本的 .csproj 并使用 netCore 作为他们的测试项目。 如果此解决方案将帮助任何无法通过重建或删除 vs/bin 文件夹或 .csproj 文件中的其他条目来修复它的人。

我不知道这个答案是 ReSharper 需要为每个人修复它的一个真正的解决方案,但它对我来说是可复制的,并且解决了我将单元测试项目保留为旧版本的 .csproj 的问题文件,至少当我有一个引用 netStandard2.0 库的 net472 单元测试项目时。

还应注意,VS2017 .csproj 文件不赞成在 Properties 文件夹中使用 AssemblyInfo.cs 文件,我不确定这是否也会导致单元测试会话出现问题。

【讨论】:

【参考方案10】:

我在解决方案中的项目之间的 nuget 依赖项中存在版本不匹配。使用 Visual Studio 中的整合功能有助于识别和解决此问题。

【讨论】:

【参考方案11】:

我在 VS2013 和 Resharper9 中遇到了同样的错误。问题是因为我忘记用 [Test] 注释测试方法:) 希望这对任何人都有帮助

【讨论】:

【参考方案12】:

这个问题是在我升级到 .NET Core 1.1.0 时开始的

在测试项目的project.json中加入如下依赖解决:

"Microsoft.DotNet.InternalAbstractions": "1.0.500-preview2-1-003177"

【讨论】:

【参考方案13】:

在我的情况下,这是由于在 TestCase 中传递了 \r\n 字符。不知道为什么它会导致间歇性问题,因为它大部分时间都有效。但是,如果我删除 \r\n 测试永远不会是不确定的:

[TestCase("test\r\n1,2\r\n3,4", 1, 2)]
public void My_Test(string message, double latitude, double longitude)

【讨论】:

【参考方案14】:

就我而言(Visual Studio Community 2017 版本 15.2),问题的根源是 VS 2017 中引入的加载项目的新方法,即“轻量级解决方案加载”。

在“单元测试会话”窗口中,我注意到解决方案的测试比它应该的要少。我必须在“解决方案资源管理器”中手动打开每个单元测试项目,然后才加载并通过所有测试。

解决此问题的一种方法是通过右键单击“解决方案资源管理器”中的解决方案并设置“禁用轻量级解决方案加载”来禁用“轻量级解决方案加载”。

【讨论】:

【参考方案15】:

有时只需尝试删除标头(.h)文件并将其重新添加为源(.cpp)重命名。 在 resharp c++​​ && vs2019 中测试,测试代码为Here

【讨论】:

【参考方案16】:

对我来说,问题是没有以任何方式等待的异步调用。

   dc.Start(); // Asynchronous, it is mocked on this particular test, so i did not bother blocking the test.

改成:

   dc.Start().ContinueWith(t =>
   
        waitHandle.Set();
   );

   waitHandle.WaitOne(60000); // wait dc start

然后测试又开始适用了。

【讨论】:

【参考方案17】:

就我而言,我的应用程序配置文件 app.config 中有错误。我在 configSections 上方放错了 appsettings,而不是把它放在里面。因此,损坏的配置文件可能是导致 Resharper 没有运行您的测试响应不确定的原因。

【讨论】:

【参考方案18】:

我在一个测试类中的所有测试都因这个问题而失败,所有其他的都运行良好。后来我在这个类的一个测试中发现 [ignore] 属性有错误。

【讨论】:

【参考方案19】:

解决这个问题的另一种方法:

在另一个环境(例如 TeamCity)中运行测试并查看您的真正问题。我的问题是不正确的绑定重定向到 System.Web.Mvc 5.2.6.0(未安装在我的机器上)。

【讨论】:

【参考方案20】:

我的问题已经被最肤浅的解决方案解决了:

将Moq nuget包添加到测试项目中解决测试方法不确定,之后可以移除nuget包。

添加 Moq 包后,我的测试方法使用以下 nuget 包运行:Castle.Core (4.4.0)、Moq (4.13.1)、NUnit (3.12.0)、System.Runtime.CompilerServices.Unsafe (4.5 .0) 和 System.Threading.Tasks.Extensions (4.5.1)

删除上述大部分 nuget 包后,我的测试方法仍然只使用 NUnit (3.12.0) 运行。

如果有人弄清楚为什么会发生这种情况,不胜感激。

【讨论】:

【参考方案21】:

希望它对其他人有所帮助,我的解决方法是更新软件包,进行了整合,并让所有工作都使用相同的软件包为我解决了这个问题。 GL!

【讨论】:

【参考方案22】:

嘎嘎。

首先是调试提示。

我跑了

dotnet 测试

从命令行。

这告诉我:

MyTests 没有正确的签名。用 [TestMethod] 属性标记的测试方法必须是非静态的、公共的、返回类型为 void 且不应带任何参数。示例:public void Test.Class1.Test()。此外,如果您在测试方法中使用 async-await,则返回类型必须是 Task。示例:公共异步任务 Test.Class1.Test2()

我去看看的时候。

[TestMethod]
private void MyFirstTest() 


嘎嘎。

我把它私有与公开。

我的解决方法:

[TestMethod]
public void MyFirstTest() 


经验教训。检查 BASIC。但“dotnet 测试”告诉了我基本知识。

【讨论】:

【参考方案23】:

就我而言,它只是缺少 .NET 5 运行时。安装后问题就消失了。

【讨论】:

【参考方案24】:

我使用 ReSharper Build 来解决这个问题。

ReSharper => Options => Tools => Build => General => Use ReSharper Build

【讨论】:

以上是关于测试方法不确定:未运行测试。错误?的主要内容,如果未能解决你的问题,请参考以下文章

由于错误无法读取未定义的模拟实现,无法使用 Jest 测试发布方法

Rspec 测试:NoMethodError - nil.Nilclass 的未定义方法“id”

通过未定义的方法错误测试“应该获取索引”

Spring Boot集成测试无法在命令行未指定配置文件时获取默认配置文件并抛出错误

grpc 测试代码退出 1 并出现“rpc 错误:代码 = 未实现的 desc = 方法 Hello 未实现”

为什么我的所有Visual Studio测试结果都“未执行”