我有一个扩展方法进行测试,所以我可以这样做:
var steve = new Zombie();
steve.Mood.ShouldBe("I'm hungry for brains!");
Run Code Online (Sandbox Code Playgroud)
扩展方法:
public static void ShouldBe<T>(this T actual, T expected)
{
Assert.That(actual, Is.EqualTo(expected));
}
Run Code Online (Sandbox Code Playgroud)
由此可见:
Expected: "I'm hungry for brains!"
But was: "I want to shuffle aimlessly"
Run Code Online (Sandbox Code Playgroud)
是否有任何黑客可以从我的扩展方法中获取属性"BrainsConsumed"的名称?奖励积分将是实例变量并输入Zombie.
更新:
新的ShouldBe:
public static void ShouldBe<T>(this T actual, T expected)
{
var frame = new StackTrace(true).GetFrame(1);
var fileName = frame.GetFileName();
var lineNumber = frame.GetFileLineNumber() - 1;
var code = File.ReadAllLines(fileName)
.ElementAt(lineNumber)
.Trim().TrimEnd(';');
var codeMessage = new Regex(@"(^.*)(\.\s*ShouldBe\s*\()([^\)]+)\)").Replace(code, @"$1 should be $3");
var actualMessage = actual.ToString();
if (actual is string)
actualMessage = "\"" + actual + "\"";
var message = string.Format(@"{0} but was {1}", codeMessage, actualMessage);
Assert.That(actual, Is.EqualTo(expected), message);
}
Run Code Online (Sandbox Code Playgroud)
这打印出来:
steve.Mood should be "I'm hungry for brains!" but was "I want to shuffle aimlessly"
Run Code Online (Sandbox Code Playgroud)
谢谢大家,特别是 Matt Dotson,这太棒了.顺便说一句,不要给丝滑的巨魔喂人.
如果是调试版本,您可以通过使用某些诊断类来获取代码。鉴于这是用于单元测试,DEBUG 可能是合理的。
public static void ShouldBe<T>(this T actual, T expected)
Run Code Online (Sandbox Code Playgroud)
{
var frame = new StackTrace(true).GetFrame(1);
var fileName = frame.GetFileName();
var lineNumber = frame.GetFileLineNumber() - 1;
string code = File.ReadLines(fileName).ElementAt(lineNumber).Trim();
Debug.Assert(actual.Equals(expected), code);
Run Code Online (Sandbox Code Playgroud)
}
对于您的示例,代码 =“steve.BrainsConsumed.ShouldBe(0);”
显然,您应该向此代码添加一些错误检查,并且您可以通过不读取文件中的所有行来使其更快。