接下来的另一个问题是:F#: Why those two collections are not equal?,下面的示例显示,在运行Open an account...
测试时,id
和contact
并未初始化。
如果有一些函数返回相同的值并在测试主体中调用,它将可以正常工作。
我想知道为什么会这样,如果在测试运行时我能做些什么使这些变量正确初始化。
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)
答案 0 :(得分:3)
这取决于如何在.NET IL中实现F#模块。模块被编译成静态类,并且模块定义的值在该类的静态构造函数中初始化。但是由于XUnit加载测试的方式,静态构造函数无法运行。
避免这种情况的一种可能方法是使用类而不是模块,因为XUnit确实运行 instance 构造函数。类中的let
函数被编译为私有方法,因此XUnit可以识别测试,而不必切换到member
语法。
type MyTests() =
let id = Guid.Empty
let contact = // ...
[<Fact>]
let ``Open an account...``() =
// ...