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
相关产品推荐
相关产品推荐

