2017-07-15 48 views
0

我想建立一個「工作」,只有當一些額外的變量是真/假的約束。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)); 
} 

但是,這並不工作。我怎樣才能做到這一點?

+0

會你,如果整個包住斷言在? –

+0

@Joe_DM是的,我可以做到這一點,但我想在斷言中執行if/else,以使測試更加簡潔。 – grokky

+0

僅基於方法鏈接的工作原理,很難讓右側的方法覆蓋左側的方法。我能想到的唯一方法就是如果它全部延遲執行,然後以某種方式在調用之前手動評估表達式。我最初的懷疑是它無法完成。但我很高興錯了。我希望有人有你在找什麼。 –

回答

1

我假設,當如果(假的),你想表達總是通過:

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

看起來你已經有了一個答案,但因爲我已經有了一個工作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; 
    } 
} 
相關問題