Dlaczego metoda Assert.That() przyjmuje jako pierwszy parametr delegat?

0

Witam, chciałem się dowiedzieć dlaczego poniższy test jednostkowy, który sprawdza czy rzuca wyjątek musi być w formie delegata? Dlaczego i po co .NET metode Assert.That() przeciążył w taki sposób Assert.That(() => errorLogger.Log(error), Throws.ArgumentNullException); zamiast podać Assert.That(errorLogger.Log(error), Throws.ArgumentNullException);?

[Test]
[TestCase("")]
[TestCase(" ")]
[TestCase(null)]
public void Log_WhenCalled_InvalidException(string error)
{
    var errorLogger = new ErrorLogger();


    Assert.That(() => errorLogger.Log(error), Throws.ArgumentNullException);
    // a czemu nie zwykłe wywolanie ?
    // Assert.That(errorLogger.Log(error), Throws.ArgumentNullException);
}


public class ErrorLogger
{
  public string LastError { get; set; }
  
  public event EventHandler<Guid> ErrorLogged; 
  
  public void Log(string error)
  {
      if (String.IsNullOrWhiteSpace(error))
          throw new ArgumentNullException();
          
      LastError = error; 
  
      ErrorLogged?.Invoke(this, Guid.NewGuid());
  }
}
5

Strzelam, że delegat jest potem opakowany w try catch inaczej test by wywaliło. Bo najpierw wywołało by się errorLogger.Log(error) a potem Assert.That

2
uczymSie napisał(a):

Dlaczego i po co .NET metode Assert.That() przeciążył w taki sposób Assert.That(() => errorLogger.Log(error), Throws.ArgumentNullException);

Chyba przeładował?

A odpowiedź na twoje pytanie, jest bardzo prosta - bo inaczej by to nie działało.

Assert.That(() => {
  errorLogger.Log(error); // tu leci wyjątek, i można go złapać
}, Throws.ArgumentNullException);

vs

var cought = errorLogger.Log(error); // tu leci wyjątek, i co z nim?
Assert.That(cought, Throws.ArgumentNullException);
3
uczymSie napisał(a):

zamiast podać Assert.That(errorLogger.Log(error), Throws.ArgumentNullException);?

Najlepsza jest nauka przez praktykę. Napisz funkcję, która tak działa, to się dowiesz. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1