c# - 如何在 F# 中使用 xUnit 和 FsCheck 检查方法是否引发异常

标签 c# unit-testing f# xunit fscheck

我正在使用 xUnit 和 FsCheck 在 C# 中执行 Diamond Kata,并使用 F# 编写测试,并且在尝试检查用户输入无效(任何字符)是否引发异常时遇到了一些麻烦这不是一个没有任何变音符号的字母)。现在的代码如下所示:

正在测试的方法:

public static string Make(char letter)
{
    if (!Regex.IsMatch(letter.ToString(), @"[a-zA-Z]"))
    {
        throw new InvalidOperationException();
    }

    // code that makes the diamond
}

测试:

[<Property>]
let ``Diamond.Make must throw an InvalidOperationException if a character that isn't 
      an alphabet letter without any diacritics is given`` (letter : char) =
    (not (('A' <= letter && letter <= 'Z') || ('a' <= letter && letter <= 'z'))) ==> lazy 
        (Assert.Throws<InvalidOperationException>(fun () -> Diamond.Make letter |> ignore))

我的方法的问题是测试表明没有抛出异常,但是当我使用测试套件显示的输入运行应用程序时,会引发异常。

这是测试套件给出的消息(我故意省略了测试名称和堆栈跟踪):

Test Outcome:   Failed
Test Duration:  0:00:00,066
Result Message: 
FsCheck.Xunit.PropertyFailedException : 
Falsifiable, after 1 test (0 shrinks) (StdGen (1154779780,296216747)):
Original:
')'
---- Assert.Throws() Failure
Expected: typeof(System.InvalidOperationException)
Actual:   (No exception was thrown)

尽管测试套件表示对于值 ')' 不会引发异常,但我对其进行了手动测试,并且确实引发了预期的异常。

如何确保测试捕获异常?

最佳答案

我认为问题是 Assert.Throws 返回给定类型的异常(如果发生)。只需忽略 Assert.Throws 的返回值应该会对您有所帮助。

let test (letter : char) =
    (not (('A' <= letter && letter <= 'Z') || ('a' <= letter && letter <= 'z'))) ==> 

    lazy
        Assert.Throws<InvalidOperationException>(fun () -> Diamond.Make letter |> ignore)
        |> ignore

关于c# - 如何在 F# 中使用 xUnit 和 FsCheck 检查方法是否引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40049507/

相关文章:

c# - 在 Bouncy CaSTLe 中使用正确的加密服务提供商更新 x509Certificate2

c# - 从 Web 服务检索 10,000 行并插入到 OWC11 电子表格中

unit-testing - VS2012 使测试结果出现在测试结果窗口

f# - 为什么当我尝试从此模块返回可变列表的内容时,总是得到一个空列表?

c# - 如何使用 C# 重命名 .rar .7z、.tar、.zip 中的文件和文件夹

c# - ASP.NET MVC 2 中具有约束的可选路由参数?

c# - 如何在 SimpleInjector 2.6.1+ 中对打开的通用装饰器链进行单元测试

c# - 尽管抛出异常,但测试 ExpectedException 的单元测试失败

F# 测量单位,类型转换时不丢失测量类型

f# - 如何在普通任务(不是 Task<T>)上使用 Async.AwaitTask?