C# 从表达式中删除匿名类字符串

C# 从表达式中删除匿名类字符串,c#,testing,expression-trees,anonymous-function,C#,Testing,Expression Trees,Anonymous Function,我一直在尝试为我的测试编写一个小的helper类,它将延迟对象的检查,直到我调用verify,然后显示所有失败表达式的列表。在我专门测试的场景中,我将6个文件复制到一个文件夹中,然后检查是否正确解析了6个文件并返回6个对象。在构建我的helper类时,我告诉它计算6==5,以便看到它失败的消息。这是helper类 internal class ObjectVerifier { private readonly Queue<DelayedTests> _delayedTests

我一直在尝试为我的测试编写一个小的helper类,它将延迟对象的检查,直到我调用verify,然后显示所有失败表达式的列表。在我专门测试的场景中,我将6个文件复制到一个文件夹中,然后检查是否正确解析了6个文件并返回6个对象。在构建我的helper类时,我告诉它计算
6==5
,以便看到它失败的消息。这是helper类

internal class ObjectVerifier
{
    private readonly Queue<DelayedTests> _delayedTests = new Queue<DelayedTests>();
    public void Verify()
    {
        var exceptions = new StringBuilder();
        while(_delayedTests.Count > 0)
        {
            var delayedTest = _delayedTests.Dequeue();
            if (!delayedTest.ObjectEvaluator.Invoke())
            {
                exceptions.AppendLine($"{delayedTest.TestExpression} failed its evaluation");
            }
        }
        if (exceptions.Length > 0)
        {
            NUnit.Framework.Assert.Fail(exceptions.ToString());
        }
    }

    internal void CheckThat(Expression<Func<bool>> evaluationTest)
    {
        _delayedTests.Enqueue(new DelayedTests
        {
            TestExpression = evaluationTest.ToString(),
            ObjectEvaluator = evaluationTest.Compile()
        });
    }

    private class DelayedTests
    {
        public string TestExpression { get; set; }
        public Func<bool> ObjectEvaluator { get; set; } 
    }
}
内部类ObjectVerifier
{
专用只读队列_delayedTests=新队列();
公共无效验证()
{
var exceptions=新的StringBuilder();
而(_delayedTests.Count>0)
{
var delayedTest=_delayedTests.Dequeue();
如果(!delayedTest.ObjectEvaluator.Invoke())
{
AppendLine($“{delayedTest.TestExpression}的计算失败”);
}
}
如果(异常长度>0)
{
NUnit.Framework.Assert.Fail(exceptions.ToString());
}
}
内部无效检查(表达式评估测试)
{
_delayedTests.Enqueue(新的delayedTests)
{
TestExpression=evaluationTest.ToString(),
ObjectEvaluator=evaluationTest.Compile()
});
}
私人类延迟测试
{
公共字符串TestExpression{get;set;}
公共函数对象计算器{get;set;}
}
}
我的测试是故意失败的

    [Test]
    public void TestGettingMenuItems()
    {
        CopyFilesToSaveFolder(TestCurseFiles);

        gbl.import_from = ImportSource.Curse;

        List<MenuItem> displayNames;
        List<MenuItem> fileNames;
        ovr017.BuildLoadablePlayersLists(out fileNames, out displayNames);

        _verifier.CheckThat((() => fileNames.Count.Equals(5)));
        _verifier.CheckThat(() => displayNames.Count.Equals(5));
        _verifier.Verify();
    }
[测试]
public void TestGettingMenuItems()
{
CopyFilesToSaveFolder(TestCurseFiles);
gbl.import_from=ImportSource.Curse;
列出显示名称;
列出文件名;
ovr017.buildLoadablePlayersList(输出文件名、输出显示名);
_检查((()=>fileNames.Count.Equals(5));
_检查(()=>displayNames.Count.Equals(5));
_verifyer.Verify();
}
测试失败的原因是正确的,但它留下的信息有点粗糙

Test Name:  TestGettingMenuItems
Test FullName:  GoldBox.Engine.ovr017Tests.TestGettingMenuItems
Test Source:    C:\Git\coab\GoldBox.Engine.Tests\ovr017Tests.cs : line 34
Test Outcome:   Failed
Test Duration:  0:05:07.258

Result StackTrace:  
at GoldBox.Engine.ObjectVerifier.Verify() in C:\Git\coab\GoldBox.Engine.Tests\ObjectVerifier.cs:line 24
at GoldBox.Engine.ovr017Tests.TestGettingMenuItems() in C:\Git\coab\GoldBox.Engine.Tests\ovr017Tests.cs:line 45
Result Message: 
() => value(GoldBox.Engine.ovr017Tests+<>c__DisplayClass8_0).fileNames.Count.Equals(5) failed its evaluation
() => value(GoldBox.Engine.ovr017Tests+<>c__DisplayClass8_0).displayNames.Count.Equals(5) failed its evaluation
测试名称:TestGettingMenuItems
测试全名:GoldBox.Engine.ovr017Tests.TestGettingMenuItems
测试源:C:\Git\coab\GoldBox.Engine.Tests\ovr017Tests.cs:第34行
测试结果:失败
测试持续时间:0:05:07.258
结果跟踪:
在C:\Git\coab\GoldBox.Engine.Tests\ObjectVerifier.cs中的GoldBox.Engine.ObjectVerifier.Verify()处:第24行
在C:\Git\coab\GoldBox.Engine.Tests\ovr017Tests.TestGettingMenuItems()中的GoldBox.Engine.ovr017Tests.Tests中:第45行
结果消息:
()=>value(GoldBox.Engine.ovr017Tests+c_udisplayClass8_0)。filename.Count.Equals(5)的计算失败
()=>value(GoldBox.Engine.ovr017Tests+c_uudisplayClass8_0)。displayNames.Count.Equals(5)的计算失败
特别是零件的
值(GoldBox.Engine.ovr017Tests+c\u显示类8\u 0)。


我有什么办法可以更改它,使它看起来更像消息中的
()=>fileNames.Count.Equals(5)
?我进入调试器,浏览了所有表达式的属性,没有找到任何简单的方法来获得我所希望的结果。

看来正则表达式可能是我的答案。我现在有了
TestExpression=Regex.Replace(evaluationTest.ToString(),@“value(+?)\)\,”,
,到目前为止,它似乎在工作,甚至在我的测试中使用Linq看起来Regex可能是我的答案。现在我有了
TestExpression=Regex.Replace(evaluationTest.ToString(),@“value(+?)\)\,”,
,到目前为止,即使在我的测试中使用Linq,它似乎也能正常工作