扩展NUnit Is类遇命名空间及Is.Not使用问题求助
解决NUnit扩展Is类的命名空间歧义与Is.Not调用自定义约束问题
一、解决Is类的命名空间歧义
你自定义的Is类继承了NUnit的NUnit.Framework.Is,但测试类同时引用两个命名空间时会出现命名冲突,这里有三种可行方案:
方案1:给自定义Is类加别名
在测试类的using声明中给自定义Is指定别名,直接避免和NUnit的Is冲突:
using System.Numerics; using NUnit.Framework; // 给自定义Is类设置别名 using CustomIs = DFA_Lib_Unit_Tests.Constraints.Is; namespace DFA_Lib_Unit_Tests.Tests { public class TestClass { [Test] public void TestMethod() { Vector2 firstVector = new Vector2(1, 1); Vector2 secondVector = new Vector2(1, 1); // 使用别名调用自定义约束的静态方法 Assert.That(firstVector, CustomIs.OnSameTile(secondVector)); } } }
方案2:直接限定命名空间调用
如果不想用别名,也可以直接通过完整命名空间调用自定义Is类:
Assert.That(firstVector, DFA_Lib_Unit_Tests.Constraints.Is.OnSameTile(secondVector));
方案3:重命名自定义Is类
最彻底的方式是把自定义的Is类改名,比如叫CustomConstraints,从根源避免命名冲突:
namespace DFA_Lib_Unit_Tests.Constraints { public class CustomConstraints : NUnit.Framework.Is { public static VectorConstraint OnSameTile(object expected) { return new VectorConstraint(expected); } } }
测试类中直接使用改名后的类:
Assert.That(firstVector, CustomConstraints.OnSameTile(secondVector));
二、解决Is.Not无法调用自定义约束的问题
结合你Edit1的发现,核心问题是扩展方法名不匹配,且要确保扩展方法作用于ConstraintExpression类型(Is.Not返回的就是这个类型)。修正后的扩展方法类如下:
namespace DFA_Lib_Unit_Tests.Constraints { public static class CustomConstraintExtensions { // 方法名改为OnSameTile,和静态方法保持一致 public static VectorConstraint OnSameTile(this ConstraintExpression expression, object expected) { var constraint = new VectorConstraint(expected); expression.Append(constraint); return constraint; } } }
修正后,测试类中就能正常使用Is.Not.OnSameTile语法:
Assert.That(firstVector, Is.Not.OnSameTile(secondVector));
另外你提到的“Is扩展类需与测试类同命名空间或父命名空间才能使用”是误解,只要测试类通过using DFA_Lib_Unit_Tests.Constraints;引用了自定义类所在的命名空间,且自定义类是public修饰的,无论是否同命名空间都能正常访问,之前的问题大概率是没添加using导致的。
内容的提问来源于stack exchange,提问作者Lee Beek
相关产品推荐
相关产品推荐

