xUnit 测试中的 ClassData 是否接受参数? C#

Does ClassData in xUnit Test accept arguments? C#

我正在为我的应用程序编写单元测试。现在我正在使用 Theory with ClassData 来创建数据驱动的单元测试。 我想知道 ClassData 是否能够接受参数,以便我可以根据测试的输入更改测试数据?

下面是一些示例代码:

这是我的数据class:

public class InvalidMessageFrame : TheoryData<string, string, string>
{
    public InvalidMessageFrame(string messageType)
    {
        var testData = ReadFromJson(handlerType);

        foreach (var data in testData ?? Enumerable.Empty<InvalidMessageTestModel>())
        {
            Add(data.description, data.message, data.exception);
        }
    }
    
    private IEnumerable<InvalidMessageTestModel> ReadFromJson(string messageType)
    {
        var messageObjectName = messageType switch
        {
            "A" => "Group A",
            "B" => "Group B",
            "C" => "Group C",
            "D" => "Group D",
            _ => throw new ArgumentOutOfRangeException(nameof(messageType), messageType, null)
        };

        var filePath = Path.Combine(Environment.CurrentDirectory, "../../../TestData/InvalidTestData.json");
        var json = File.ReadAllText(filePath);
        var jObject = JObject.Parse(json);
        var testData = jObject[messageObjectName]?.ToObject<IEnumerable<InvalidMessageTestModel>>();

        return testData;
    }
}

这是我的测试:

    [Theory]
    [ClassData(typeof(InvalidMessageFrame("A")))]
    public void InvalidTest(string description, string message, string exception)
    {     
    }

如您所见,我试图让 Class 数据接受一个参数,以便我可以根据组 ABCD 更改测试数据,因为在我的测试数据 json 文件中,每个组是测试数据的列表。但是,我的设置似乎不可能,因为此行 [ClassData(typeof(InvalidMessageFrame("A")))] 的测试中显示错误,错误是:) expected.

所以如果这不起作用,我想知道是否有其他方法可以达到相同的结果?

谢谢。

使用 typeof 你只能得到 typeof class 而不是调用构造函数所以你只能写

[ClassData(typeof(InvalidMessageFrame))]

你可以构建这样的东西 https://andrewlock.net/creating-a-custom-xunit-theory-test-dataattribute-to-load-data-from-json-files/