В основном NUnit, xUnit, MbUnit, MsTest и т.п. имеют методы, подобные следующим:
Assert.IsGreater(a,b)
//or, a little more discoverable
Assert.That(a, Is.GreaterThan(b))
Однако есть ограниченный количество таких встроенных операторов сравнения; и они без нужды дублируют операторы языков. Когда мне нужно что-то даже немного сложное, например ...
Assert.That(a.SequenceEquals(b))
Мне часто приходится либо копаться в руководстве, чтобы найти эквивалент выражения в NUnit-speak, либо мне приходится возвращаться к простым логическим утверждениям с менее полезные сообщения об ошибках.
C #, однако, хорошо интегрируется с произвольными выражениями, поэтому должна быть возможность иметь метод со следующей сигнатурой:
void That(Expression> expr);
Такой метод может использоваться как для выполнения теста (т.е. assertion), а также для обеспечения менее непрозрачной диагностики в случае неудачи теста; после всего, выражение может быть преобразовано в псевдокод, чтобы указать, какое выражение не удалось; и с некоторыми усилиями вы могли бы даже разумно оценивать ошибочные выражения, чтобы дать некоторое представление о значении подвыражений.
Например:
Assert.That(()=> a == b);//could inspect expression and print a and b
Assert.That(()=> a < b && b < c);
//could mention the values of "a
Как минимум, это сделало бы использование параллельного языка для выражений ненужным, а в в некоторых случаях это может сделать сообщения о сбоях более полезными.
Существует ли такая вещь?
Редактировать: Попробовав (и полюбив!) Power Assert, я закончил его повторной реализацией, чтобы устранить несколько ограничений. Мой вариант опубликован как ExpressionToCode ; см. мой ответ ниже для получения списка улучшений.