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)
无法在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限制的话,它会显得更加冗长,但它们是可以理解的......
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |