Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 当使用“勾选的方法名称”时,是否可以参数化NUnit测试用例显示名称?_F#_Nunit - Fatal编程技术网

F# 当使用“勾选的方法名称”时,是否可以参数化NUnit测试用例显示名称?

F# 当使用“勾选的方法名称”时,是否可以参数化NUnit测试用例显示名称?,f#,nunit,F#,Nunit,我正在测试F#,并使用NUnit作为我的测试库;我发现使用双回标记可以允许任意方法命名,从而使我的方法名更具可读性 我想知道,在使用NUnit的TestCaseAttribute更改方法名称时,是否可以对方法名称进行参数化,例如: [<TestCase("1", 1)>] [<TestCase("2", 2)>] let ``Should return #expected when "#input" is supplied`` input expected = .

我正在测试F#,并使用NUnit作为我的测试库;我发现使用双回标记可以允许任意方法命名,从而使我的方法名更具可读性

我想知道,在使用NUnit的
TestCaseAttribute
更改方法名称时,是否可以对方法名称进行参数化,例如:

[<TestCase("1", 1)>]
[<TestCase("2", 2)>]
let ``Should return #expected when "#input" is supplied`` input expected =
    ...
[]
[]
如果提供了“#input”,则让“`Should返回#expected”`input expected=
...
这是不可能的

基本问题是,对于每个
输入
预期
,您需要创建一个唯一的函数。然后需要选择正确的函数来调用(否则stacktrace就没有意义了)。因此,这是不可能的


话虽如此,如果您使用类似于
eval
(必须存在于fsi内部)的东西进行黑客攻击,可能会创建类似的东西,但速度会非常慢。

这可能不是您所需要的,但如果您想超越单元测试,那么(使用F#的BDD框架)它有一个很好的特性,允许您基于包含正则表达式作为占位符的back-tick方法编写参数化场景

例如,在中,他使用此定义tic-tac-toe场景:

Scenario: Winning positions
    Given a board layout:
        | 1 | 2 | 3 |
        | O | O | X |
        | O |   |   |
        | X |   | X |
    When a player marks X at <row> <col>
    Then X wins

Examples:
    | row    | col    | 
    | middle | right  |
    | middle | middle |
    | bottom | middle |

这是一件很好的事情,但是如果您只想编写一个简单的参数化单元测试,那么这可能是一件过分的事情-如果您想生成不同场景的人类可读规范(实际上还有其他人在阅读它们!),那么BDD很有用。

认为OP意味着可以取消它(/xUnit)生成一个测试用例DisplayName,并替换标记。i、 e.
应该在提供“1”时返回1
等。而不是
应该从原始(1,“1”)返回TransformedFromiginal
@RubenBartelink是的,这正是我想要的。如果在NUnit中呈现的测试用例名称是可定制的,如果您有不同的
TestCaseAttribute
,我不会感到惊讶,它并不是一个本质上受支持的特性,而且由于很少有其他.NET语言支持这种任意命名,它也不太可能成为一个特性。我认为,虽然它对这个案例很有用,但它并不是一个普遍有用的概念来考虑支持作为一个核心的事情。FuCube可以轻松地做到这一点:我一直在关注TigkScript()视频,这几乎是我所追求的。我想我会在这里与那些不了解TickSpec的人分享:@MauricioScheffer ahh错过了你的链接,看起来很酷,我一定会查看它的。谢谢你的回答,TickSpec会做我想要的(不完全是,但足够好),我在视频中添加了一个链接,作为对我问题的评论。
let [<When>] ``a player marks (X|O) at (top|middle|bottom) (left|middle|right)`` 
        (mark:string,row:Row,col:Col) =       
    let y = int row             
    let x = int col        
    Debug.Assert(System.String.IsNullOrEmpty(layout.[y].[x]))
    layout.[y].[x] <- mark