我试图建立一个"工作"只有当一些额外的变量为真/假时。
所以我可以这样使用它:
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));
}
但这并不奏效。我怎么能这样做?
答案 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;
}
}