如何使用xUnit测试ref struct方法是否抛出异常?

Tra*_*uer 9 c# xunit ref-struct

我是xUnit的新手,但据我所知,检查是否抛出异常的标准方法是使用Assert.Throws<T>Assert.ThrowsAny<T>方法.

但是这些方法期望将Action作为参数; 并且ref结构不能"嵌入"lambda中.

那么,如何测试ref struct的给定方法是否抛出?不起作用的代码示例:

[Fact]
public void HelpMe() {
    var pls = new Span<byte>();
    Assert.ThrowsAny<Exception>(() => {
        plsExplode = pls[-1];
    });
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

无法在lambda表达式中捕获 ref结构,但您仍然可以在lambda表达式中使用它 - 您只需要在那里声明变量,这样它就不会是非ref-struct中的字段.

例如,这会编译并成功:

[Fact]
public void HelpMe()
{
    Assert.ThrowsAny<Exception>(() => {
        var pls = new Span<byte>();
        var plsExplode = pls[-1];
    });
}
Run Code Online (Sandbox Code Playgroud)

现在我将是第一个承认这不理想的人:你真的想在动作中尽可能少地完成工作,这样你只有在预期的代码段失败时才会通过.

Assert.Throws在那里使用帮助,以便只有预期的异常导致传递.此外,您可以捕获bool在投掷部分之前更改的内容,然后检查您是否已达到目标:

[Fact]
public void HelpMe()
{
    bool reachedThrowingPart = false;
    Assert.Throws<IndexOutOfRangeException>(() =>
    {
        var span = new Span<byte>();
        reachedThrowingPart = true;
        var ignored = span[-1];
    });
    Assert.True(reachedThrowingPart);
}
Run Code Online (Sandbox Code Playgroud)

如果它不是用于reftruct限制的话,它会显得更加冗长,但它们是可以理解的......