C# 如何检查xUnit和FsCheck在F中的方法是否引发异常#

C# 如何检查xUnit和FsCheck在F中的方法是否引发异常#,c#,unit-testing,f#,xunit,fscheck,C#,Unit Testing,F#,Xunit,Fscheck,我正在用C#编写菱形Kata,测试用F#编写,使用xUnit和FsCheck,当我试图检查用户输入无效时是否抛出异常时遇到了一些问题(任何字符都不是没有任何发音符号的字母)。下面是代码现在的样子: 正在测试的方法: public static string Make(char letter) { if (!Regex.IsMatch(letter.ToString(), @"[a-zA-Z]")) { throw new InvalidOperationExcep

我正在用C#编写菱形Kata,测试用F#编写,使用xUnit和FsCheck,当我试图检查用户输入无效时是否抛出异常时遇到了一些问题(任何字符都不是没有任何发音符号的字母)。下面是代码现在的样子:

正在测试的方法:

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

    // code that makes the diamond
}
测试:

[]
如果一个字符不是无效的,则让``Diamond.Make必须抛出InvalidOperationException
一个没有任何变音符号的字母被赋予了“`”(字母:char)=

(不是(('A'我认为问题在于,如果发生异常,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
let测试(字母:char)=
(不(('A'忽略)

请发布您收到的整个测试失败消息。另外,请格式化代码,以便不必滚动。我猜FsCheck很容易伪造该属性。有许多
char
值不在此处给出的范围内,例如
ü
ø
。这些仍然是字母acc根据
Char.IsLetter
。你知道你现在正在测试Char.IsLetter吗?@foggyinder我认为这不公平。测试是先决条件是否正确实现,如果我正确理解问题,则不是。尝试取消引用和/或在F中的单元测试中观察Mark show你,当然,at-works会更好h xUnit的.Assert(xUnit本身很好,只是Assert最好被替换)属性不必返回布尔值;它们也可以返回
unit
,或者
Property
。为了返回
unit
,将
Assert.Throws
的结果管道化到
ignore
应该足够了。
let test (letter : char) =
    (not (('A' <= letter && letter <= 'Z') || ('a' <= letter && letter <= 'z'))) ==> 

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