F#:运行测试时,如何在XUnit测试函数上方定义的变量实际初始化?

时间:2019-06-06 21:07:27

标签: f# initialization xunit

接下来的另一个问题是:F#: Why those two collections are not equal?,下面的示例显示,在运行Open an account...测试时,idcontact并未初始化。

如果有一些函数返回相同的值并在测试主体中调用,它将可以正常工作。

我想知道为什么会这样,如果在测试运行时我能做些什么使这些变量正确初始化。

let id = Guid.Empty
let contact = {
    Name = {
        FirstName = "Marcel"
        MiddleInitial = None
        LastName = "Patulacci"
    }
    DateOfBith = new DateTime(1850, 12, 25)
    Address = {
        Address1 = "41 av 8 Mai 1945"
        Address2 = None
        City = "Sarcelles"
        State = None
        Zip = "95200"
    }
    PhoneNumber = {
        DialOutCode = 33
        LocalNumber = "766030703"
    }
    Email = "marcel.patulacci@outlook.com"
}

[<Fact>]
let ``Open an account...``() =
    let event = Event.AccountOpened({
        AccountId = id
        Contact = contact
    })

    let a = [event]
    let b = seq { yield event }

    Assert.Equal(a, b)

1 个答案:

答案 0 :(得分:3)

这取决于如何在.NET IL中实现F#模块。模块被编译成静态类,并且模块定义的值在该类的静态构造函数中初始化。但是由于XUnit加载测试的方式,静态构造函数无法运行。

避免这种情况的一种可能方法是使用类而不是模块,因为XUnit确实运行 instance 构造函数。类中的let函数被编译为私有方法,因此XUnit可以识别测试,而不必切换到member语法。

type MyTests() =

    let id = Guid.Empty
    let contact = // ...

    [<Fact>]
    let ``Open an account...``() =
        // ...