如何使用F#完整语法停止我的FSUnit测试

时间:2012-05-18 09:03:45

标签: f# fsunit

我们正在使用精彩的FSUnit进行单元测试。这很好,除了我们测试的主体坚持使用完整的F#语法(每行末尾有'in')而不是#light语法。例如:

module MyTests

open System
open NUnit.Framework
open FsUnit
open MyModule

[<TestFixture>] 
type ``Given a valid file`` () =

    let myFile = createSomeFile()

    [<Test>] member x.
     ``Processing the file succeeds`` () =
        let actual = processFile myFile in
        actual |> should be True

注意测试第一行末尾的“in”。没有它,测试将无法编译 - 这对于短期测试来说很好,但是对于更长的测试方法而言却变得很痛苦。我们已经尝试在源代码中添加一个明确的#light,但这似乎没有任何区别。这是一个包含许多模块的大型项目的一部分,除了测试模块之外,所有模块都很乐意使用轻量级语法(没有任何明确的#light)。什么在测试模块中触发完整语法?

1 个答案:

答案 0 :(得分:2)

在编写类的成员时,您需要使用一些不同的缩进。以下应该没问题:

[<TestFixture>]  
type ``Given a valid file`` () = 
    let myFile = createSomeFile() 

    [<Test>] 
    member x.``Processing the file succeeds`` () = 
        let actual = processFile myFile
        actual |> should be True 

第一个问题是成员的名称应该比.缩进,第二个问题是成员的主体应该比member关键字缩进 - 在你的版本中,关键字是在[<Test>]之后写的,所以如果你进一步缩进主体,它就会起作用。

添加in解决了这个问题,因为它更明确地告诉编译器如何解释代码(因此它不依赖于缩进规则)。

除了 - 使用一些单元测试框架,也可以使用module,这会给你一些更轻的语法(但我不知道如果你需要一些初始化,它是如何工作的 - 即加载文件):

[<TestFixture>]  
module ``Given a valid file`` = 
    let myFile = createSomeFile() 

    [<Test>] 
    let ``Processing the file succeeds`` () = 
        let actual = processFile myFile
        actual |> should be True