我正在测试F#并使用NUnit作为我的测试库;我发现使用双后退标记允许任意方法命名使我的方法名称更具人性化。
我想知道,无论是对还是错,如果在使用NUnit的TestCaseAttribute
更改方法名称时可以参数化方法名称,例如:
[<TestCase("1", 1)>]
[<TestCase("2", 2)>]
let ``Should return #expected when "#input" is supplied`` input expected =
...
答案 0 :(得分:5)
这可能不是您所需要的,但如果您想超越单元测试,那么TickSpec(使用F#的BDD框架)有一个很好的功能,它允许您基于后面编写参数化方案勾选包含正则表达式作为占位符的方法。
例如,在Phil Trelford's blog post中,他使用它来定义井字游戏场景:
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 |
实现场景的When
子句的方法在F#中使用如下内容定义:
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
这是一个很好的事情,但是如果你只是想编写一个简单的参数化单元测试,它可能是一种矫枉过正 - 如果你想生成不同场景的人类可读规范(实际上有其他人阅读它们),BDD很有用!)
答案 1 :(得分:1)
这是不可能的。
基本问题是,对于每个input
和expected
,您需要创建一个独特的功能。然后,您需要选择正确的函数来调用(或者您的堆栈跟踪没有意义)。因此,这是不可能的。
话虽如此,如果你用eval
(必须存在于fsi中)之类的东西进行攻击,可能会创建类似这样的东西,但它会非常慢。