You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio 2017升级NUnit后继承NHibernate的测试类无法被发现

解决NUnit 3.9.0升级后Spring/NHibernate测试类无法被发现的问题

我之前也踩过类似的版本兼容坑,核心原因其实很清晰:你用的Spring.Testing.NUnit 2.0.1是专门为NUnit 2.x开发的,完全没适配NUnit 3.x的测试发现机制。NUnit 3.x对测试类的识别规则、特性标记要求做了大幅调整,旧的Spring测试基类AbstractTransactionalSpringContextTests不符合这些新规则,自然就被Test Explorer忽略了。

下面是几个可行的解决方案,按优先级排序:

1. 升级Spring.Testing.NUnit到兼容NUnit 3的版本

最省心的方式是直接找支持NUnit 3的Spring.Testing.NUnit版本。Spring.NET后续更新中推出了适配NUnit 3的包,你可以尝试安装Spring.Testing.NUnit的3.x系列版本(比如3.0.0及以上),这个版本会针对NUnit 3的测试发现和执行逻辑做适配,能直接解决兼容性问题。

2. 手动适配NUnit 3的测试发现要求

如果暂时无法升级Spring包,可以手动给测试类和基类补充NUnit 3要求的特性,并调整结构:

  • 确保你的NHibernateTestClass和所有测试类都标记[TestFixture]特性(NUnit 3.x要求测试类必须显式标记,而NUnit 2.x允许隐式识别)
  • 检查AbstractTransactionalSpringContextTests是否有符合NUnit 3要求的无参构造函数,如果没有,在自己的NHibernateTestClass中添加一个
  • 确保测试方法都显式标记[Test]特性

修改后的NHibernateTestClass示例:

using System;
using NHibernate;
using Spring.Data.NHibernate.Generic;
using Spring.Data.NHibernate.Support;
using Spring.Testing.NUnit;
using NUnit.Framework; // 显式引用NUnit命名空间

namespace Testproject{
    [TestFixture] // 添加NUnit 3要求的特性
    public class NHibernateTestClass : AbstractTransactionalSpringContextTests {
        // 添加无参构造函数(如果基类未提供)
        public NHibernateTestClass() : base() {}

        // 测试相关方法
    }
}

3. 替换旧的Spring测试基类,自行实现事务和上下文管理

如果找不到兼容的Spring包,或者不想依赖旧的Spring测试类,最稳妥的方式是自己实现一个适配NUnit 3的NHibernate测试基类,完全脱离旧的Spring-NUnit依赖。

示例代码如下:

using NUnit.Framework;
using NHibernate;
using Spring.Context.Support;
using Spring.Data.NHibernate.Generic;

namespace Testproject
{
    [TestFixture]
    public class CustomNHibernateTestBase
    {
        protected IApplicationContext SpringContext { get; private set; }
        protected ISessionFactory SessionFactory { get; private set; }
        protected ISession CurrentSession { get; private set; }
        protected ITransaction TestTransaction { get; private set; }

        // 一次性加载Spring上下文(所有测试类共享)
        [OneTimeSetUp]
        public void InitializeSpringContext()
        {
            // 根据你的实际配置文件路径调整
            SpringContext = new XmlApplicationContext("your-spring-config.xml");
            SessionFactory = SpringContext.GetObject<ISessionFactory>("SessionFactory");
        }

        // 每个测试方法执行前初始化会话和事务
        [SetUp]
        public void StartTestTransaction()
        {
            CurrentSession = SessionFactory.OpenSession();
            TestTransaction = CurrentSession.BeginTransaction();
        }

        // 每个测试方法执行后回滚事务并关闭会话
        [TearDown]
        public void CleanupTest()
        {
            if (TestTransaction != null && TestTransaction.IsActive)
            {
                TestTransaction.Rollback(); // 测试环境建议回滚,避免污染数据
            }
            CurrentSession?.Close();
        }

        // 所有测试完成后销毁Spring上下文
        [OneTimeTearDown]
        public void DisposeSpringContext()
        {
            SpringContext?.Dispose();
        }
    }
}

然后你的测试类就可以继承这个自定义基类:

using NUnit.Framework;

namespace Testproject{
    [TestFixture]
    public class TestClass: CustomNHibernateTestBase{
        [Test]
        public void YourTestMethod()
        {
            // 这里可以使用CurrentSession操作NHibernate,事务会自动管理
        }
    }
}

最后补充两个检查项:

  • 确保NUnitTestAdapter版本和NUnit 3.9.0兼容,你当前用的3.9是匹配的,不过可以尝试更新到最新的兼容版本
  • 确认测试项目的目标.NET Framework版本不低于NUnit和Spring包的要求(比如至少.NET Framework 4.5及以上)

内容的提问来源于stack exchange,提问作者joseatchang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:10:54