F# 当使用“勾选的方法名称”时,是否可以参数化NUnit测试用例显示名称?
我正在测试F#,并使用NUnit作为我的测试库;我发现使用双回标记可以允许任意方法命名,从而使我的方法名更具可读性 我想知道,在使用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 = .
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