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

扩展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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:00:17