C# 测试我的json数据解析器应该返回一个记录器

C# 测试我的json数据解析器应该返回一个记录器,c#,unit-testing,moq,xunit,C#,Unit Testing,Moq,Xunit,让我们看看我的json字符串结构 因此有7个记录器,让我们展开节点以了解详细信息 { "root_logger" : "MyFailoverLogger", "loggers": [ { "logger_name": "MyFileLogger", "logger_type": "MyCompany.Loggers.FileSystemLogger", "layout": "${message}|${exception}",

让我们看看我的json字符串结构

因此有7个记录器,让我们展开节点以了解详细信息

{
"root_logger" : "MyFailoverLogger",
"loggers": [
    {
        "logger_name": "MyFileLogger",
        "logger_type": "MyCompany.Loggers.FileSystemLogger",
        "layout": "${message}|${exception}",
        "stack_trace": {
            "error": true,
            "fatal": false
        },
        "file_path_pattern" : "\\\\corporate.MyCompany.com\\data\\recordings\\logs\\YYYY\\MM\\DD",
        "file_name_pattern" : "app.{MMDDhhmm}.log",
        "rollover_after_n_hours" : 5,
        "rollover_after_n_megabytes": 5,
        "level" : {
            "min_level" : "INFO",
            "max_level" : "DEBUG"
        }
    },
    {
        "logger_name" : "MyDbLogger",
        "logger_type" : "MyCompany.Loggers.DatabaseLogger",
        "connection_string" : "",
        "target_table" : "",
        "command_timeout_milliseconds" : 100,
        "layout" : "${message}",
        "level" : {
            "min_level" : "INFO",
            "max_level" : "DEBUG"
        }
    },
我不知道如何测试它,但我这里有主要代码

 [Theory]
    [InlineData("MyFileLogger")]
    [InlineData("MyDbLogger")]
    [InlineData("MyDbLogger2")]
    [InlineData("MyConsoleLogger")]
    [InlineData("MyNullLogger")]
    [InlineData("MyMultiplexingLogger")]
    [InlineData("MyFailoverLogger")]
    public void JSONConfigurationFileParser_Should_Return_A_Logger_Given_A_Name(string expextedLoggerName)
    {
        // ARRANGE
        var currentFilePath = Environment.CurrentDirectory + @"\MyCompanyConfiguration.json";
        var jsonString = File.ReadAllText(currentFilePath);
        var jsonConfigurationFileParser = new JSONConfigurationFileParser(jsonString);

        // ACT
        var actualLoggers = jsonConfigurationFileParser.DeserializeLogger();// It is a collection.

        // ASSERT
    }

actualLoggers
会返回所有7个记录器。我的问题是,我不知道如何正确地测试它。我应该使用
InlineData
还是其他什么?我现在把断言部分留空了。顺便说一下,使用Moq是可以的。

因为InlineData参数将为每个属性调用一次测试。您只需要在反序列化对象中添加一个搜索,以查找您希望看到的特定节点

由于您没有显示反序列化格式是什么,因此我将在示例中进行猜测

[Theory]
[InlineData("MyFileLogger")]
[InlineData("MyDbLogger")]
[InlineData("MyDbLogger2")]
[InlineData("MyConsoleLogger")]
[InlineData("MyNullLogger")]
[InlineData("MyMultiplexingLogger")]
[InlineData("MyFailoverLogger")]
public void JSONConfigurationFileParser_Should_Return_A_Logger_Given_A_Name(string expectedLoggerName)
    {
        // ARRANGE
        var currentFilePath = Environment.CurrentDirectory + @"\MyCompanyConfiguration.json";
        var jsonString = File.ReadAllText(currentFilePath);
        var jsonConfigurationFileParser = new JSONConfigurationFileParser(jsonString);

        // ACT
        var actualLoggers = jsonConfigurationFileParser.DeserializeLogger();

        // ASSERT
        Assert.True(actualLoggers.Any(x=> x.Name == expectedLoggerName));
    }
此时,您需要确定这是否是一个测试解析器的通用测试,在这种情况下,向解析器抛出一些不同的配置文件,并为这些场景编写特定的测试(即格式错误的文件、单个记录器、多个记录器等)。这些测试应该证明解析器工作正常


一个像您这样的测试用例,用于显示每个记录器都已被解析,再加上一个没有InlineData参数的附加测试,以显示解析的总节点数是正确的。您的测试试图完成什么?如果它是预期的记录器的存在,那么某种类型的contains测试将是合适的。@SteveMitcham,我认为是这样,但是会有很多
contains
。我应该按预期传递长json字符串吗?Like?
ActualLogger
是一个集合,它有7个记录器。说
ActualLogger.ToList()[0]
是用于
MyFileLogger“
等。有更好的方法吗?我甚至认为使用propertydata,每个对象都包含每个记录器。有什么想法吗?这取决于你想通过这个单元测试完成什么。您是在测试您的配置文件还是JSON解析器?我可能会说两者都是。正如我在回答中所说,这将是不同的测试。要测试解析器,请传入特定字符串,并且不涉及文件。要测试该文件,您需要确定要检查的内容,顺序是否重要,然后使用索引确保记录器位于正确的位置。如果仅显示属性,则检查正在加载的记录器上的所有属性。单元测试需要实践,所有的细微差别都超出了我们在这里所能回答的范围。等等。我标出了答案。但是Assert在
XUNIT
中是否有
IsTrue
。编译失败了。