gpt4 book ai didi

c# - 这在 C# 中可能吗?

转载 作者:太空狗 更新时间:2023-10-29 19:38:13 25 4
gpt4 key购买 nike

我有一个测试扩展方法,所以我可以这样做:

var steve = new Zombie();
steve.Mood.ShouldBe("I'm hungry for brains!");

扩展方法:

public static void ShouldBe<T>(this T actual, T expected)
{
Assert.That(actual, Is.EqualTo(expected));
}

这表明:

Expected: "I'm hungry for brains!"
But was: "I want to shuffle aimlessly"

是否有任何 hack 我可以从我的扩展方法中获取属性“BrainsConsumed”的名称?奖励点将是实例变量和僵尸类型。

更新:

新的 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);
}

然后打印出来:

steve.Mood should be "I'm hungry for brains!" but was "I want to shuffle aimlessly"

谢谢大家,特别是。马特·多森,这太棒了。顺便说一句,不要喂食丝滑的巨魔。

最佳答案

如果它是调试版本,您可以通过使用一些诊断类来获取代码。鉴于这是针对单元测试,DEBUG 可能是合理的。

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;

string code = File.ReadLines(fileName).ElementAt(lineNumber).Trim();

Debug.Assert(actual.Equals(expected), code);

对于您的示例,代码 = "steve.BrainsConsumed.ShouldBe(0);"

显然,您应该为此代码添加一些错误检查,并且您可以通过不读取文件中的所有行来使其更快。

关于c# - 这在 C# 中可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1858217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com