Лучшее, что я могу сделать:
steve.Property(p => p.BrainsConsumed).ShouldBe(0);
или
steve.ShouldBe(p => p.BrainsConsumed, 0);
или
Assert.AreEqual(() => steve.BrainsConsumed, 0);
Re:
Бонусными баллами будет переменная экземпляра
Используя Expression<Func<TSource, TValue>>
(или просто Expression<Func<T>>
), вы можете довольно легко получить имя и значение свойства. Я приведу пример для середины - обратите внимание, что для первого требуется дополнительный тип для DSL, но ничего тяжелого:
public static class Test
{
public static void AssertEqual<TSource, TValue>(
this TSource source,
Expression<Func<TSource, TValue>> selector,
TValue expected)
where TSource : class
{
TValue value = selector.Compile()(source);
string paramName = selector.Parameters[0].Name;
System.Diagnostics.Debug.Assert(
EqualityComparer<TValue>.Default.Equals(value, expected),
typeof(TSource) + " " + paramName + ": " +
value + " doesn't match expected " + expected);
}
}
Или немного лучше сообщение:
public class Zombie
{
public int BrainsConsumed { get; set; }
static void Main() {
Zombie steve = new Zombie { BrainsConsumed = 2 };
Test.ShouldBeEqual(() => steve.BrainsConsumed, 0);
}
}
public static class Test
{
static string GetName(Expression expr)
{
if (expr.NodeType == ExpressionType.MemberAccess)
{
var me = (MemberExpression)expr;
string name = me.Member.Name, subExpr = GetName(me.Expression);
return string.IsNullOrEmpty(subExpr)
? name : (subExpr + "." + name);
}
return "";
}
public static void ShouldBeEqual<TValue>(
Expression<Func<TValue>> selector,
TValue expected)
{
TValue value = selector.Compile()();
string name = GetName(selector.Body);
System.Diagnostics.Debug.Assert(
EqualityComparer<TValue>.Default.Equals(value, expected),
typeof(TValue) + " " + name + ": " +
value + " doesn't match expected " + expected);
}
}