NUnit约束否定了之前的内容

时间:2017-07-15 05:03:29

标签: c# nunit

我试图建立一个"工作"只有当一些额外的变量为真/假时。

所以我可以这样使用它:

Assert.That(animals, Is.SupersetOf(dogs).If(isSuperset));

Not约束否定了之后发生的事情,但没有任何约束来否定之前发生的事情。

到目前为止,我有这个:

public static Constraint If(this Constraint expression, bool isTrue)
{
  return ((Constraint)(((IResolveConstraint)expression).Resolve()))
         .And.Append(new EqualConstraint(isTrue).And.EqualTo(true));
}

但这并不奏效。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

我假设当If(false)时,你希望表达式总是传递:

public static class Ext
{
    public static Constraint If(this Constraint expression, bool isTrue)
    {
        return new IfConstraint(expression, isTrue);
    }

    public class IfConstraint : Constraint
    {
        private Constraint _linkedConstraint;
        private bool _isTrue;

        public IfConstraint(Constraint linkedConstraint, bool isTrue)
        {
            _linkedConstraint = linkedConstraint;
            _isTrue = isTrue;
        }

        public override ConstraintResult ApplyTo<TActual>(TActual actual)
        {
            if (!_isTrue)
                return new ConstraintResult(this, actual, true);
            return _linkedConstraint.ApplyTo<TActual>(actual);
        }
    }
}

答案 1 :(得分:1)

看起来你已经得到了答案,但由于我已经有了工作POC,我认为无论如何我都会分享它。

继承人的所作所为:

public class TheFooClass
{
    [Test]
    public void TheFooTest()
    {
        Assert.That(true, Is.True.If(false)); // passes
        Assert.That(true, Is.True.If(true)); // passes
        Assert.That(false, Is.True.If(false)); // passes
        Assert.That(false, Is.True.If(true)); // fails
    }
}

public static class AssertionExtensions
{
    public static Constraint If(this Constraint expression, bool isTrue)
    {
        return isTrue ? expression : new AlwaysTrue();
    }
}

public class AlwaysTrue : Constraint
{
    public override ConstraintResult ApplyTo<TActual>(TActual actual)
    {
        var trueResult = new ConstraintResult(new TrueConstraint(), true);
        trueResult.Status = ConstraintStatus.Success;
        return trueResult;
    }
}