В основном 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-talk, либо вынужден вернуться к простым логическим утверждениям с менее полезными сообщениями об ошибках.
С#, однако, хорошо интегрируется с произвольными выражениями, поэтому должен быть возможно иметь метод со следующей сигнатурой:
void That(Expression<Func<bool>> expr);
Такой метод может использоваться как для выполнения теста (т.е. подтверждения утверждения), так и для обеспечения менее непрозрачной диагностики в случае отказа теста; в конце концов, выражение может быть представлено псевдокоду, чтобы указать, какое выражение не удалось; и с некоторым усилием вы могли бы даже разумно оценить ошибочные выражения, чтобы дать некоторое представление о значении подвыражений.
Например:
Assert.That(()=> a == b);//could inspect expression and print a and b
Assert.That(()=> a < b && b < c);
//could mention the values of "a<b" and "b<c" and/or list the values of a, b, and c.
Как минимум, это сделает использование параллельного языка для выражений ненужным, и в некоторых случаях это может сделать сообщения об ошибках более полезными.
Существует ли такая вещь?
Изменить: После попытки (и симпатии!) Power Assert я закончил переопределять его, чтобы устранить несколько ограничений. Мой вариант этого опубликован как ExpressionToCode; см. мой ответ ниже для получения списка улучшений.