В основном 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-говорящем, либо вынужден вернуться к простым логическим утверждениям с менее полезными сообщениями об ошибках.
C #, тем не менее, хорошо интегрируется с произвольными выражениями - поэтому должна быть возможность иметь метод со следующей сигнатурой:
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 ; см. мой ответ ниже для списка улучшений.