F#:如何在 运行 测试时实际初始化 XUnit 测试函数上面定义的变量?
F#: how to have the variables defined above a XUnit test function actually initialized when running the test?
跟进另一个问题: 下面的例子表明当运行 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)
这取决于 F# 模块在 .NET IL 中的实现方式。模块被编译成静态 classes,module-defined 值在 class 的静态构造函数中被初始化。但是由于 XUnit 加载测试的方式,静态构造函数不是 运行.
一种可能的规避方法是使用 class 而不是模块,就像 XUnit 使用 运行 instance 构造函数一样。 let
class 中的函数被编译为私有方法,因此 XUnit 无需切换到 member
语法即可识别测试。
type MyTests() =
let id = Guid.Empty
let contact = // ...
[<Fact>]
let ``Open an account...``() =
// ...
跟进另一个问题: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)
这取决于 F# 模块在 .NET IL 中的实现方式。模块被编译成静态 classes,module-defined 值在 class 的静态构造函数中被初始化。但是由于 XUnit 加载测试的方式,静态构造函数不是 运行.
一种可能的规避方法是使用 class 而不是模块,就像 XUnit 使用 运行 instance 构造函数一样。 let
class 中的函数被编译为私有方法,因此 XUnit 无需切换到 member
语法即可识别测试。
type MyTests() =
let id = Guid.Empty
let contact = // ...
[<Fact>]
let ``Open an account...``() =
// ...