当我使用NUnit 2.6.3运行此FsUnit测试时,
let f xs = Some (List.map ((+) 2) xs)
[<Test>]
let test() =
f []
|> should equal (Some [])
Run Code Online (Sandbox Code Playgroud)
我明白了:
Result Message:
Expected: <Some([])>
But was: <Some([])>
Result StackTrace:
at FsUnit.TopLevelOperators.should[a,a](FSharpFunc`2 f, a x, Object y)
Run Code Online (Sandbox Code Playgroud)
即使消息中的Expected和Actual相同,测试也会失败.发生了什么?
我正在使用Visual Studio Professional 2015,并且安装了NUnit测试适配器的2.0.0.0版本.
它没有发现构建以下代码的任何测试:
namespace SmallestDivisibleIntegers
module Core =
let f n = [2..4] |> List.map (fun x -> x + n - n % x)
module Tests =
open FsUnit
open NUnit.Framework
open Core
[<Test>]
let ``Correct answers`` () =
f 1 |> should equal [2; 3; 4]
f 4 |> should equal [6; 6; 8]
f 43 |> should equal [44; 45; 44]
f 123 |> should equal [124; 126; 124]
f 420 |> should equal [422; …Run Code Online (Sandbox Code Playgroud) 如何在FsUnit的断言中忽略受歧视的并集案例的价值?
举个例子:
type TransactionAttempt = {
Deposited:float
Requires:float
}
type RequestResult =
| Denied of TransactionAttempt
| Granted of Product
Run Code Online (Sandbox Code Playgroud)
在我的测试中,我想这样做:
let display = balance |> select Pepsi
display |> should equal Denied
Run Code Online (Sandbox Code Playgroud)
我不介意这样做:
display |> should equal (Denied _)
Run Code Online (Sandbox Code Playgroud)
但是,我被迫这样做:
display |> should equal (Denied {Deposited=0.25; Requires=1.00})
Run Code Online (Sandbox Code Playgroud)
注意我必须明确表达上面的表达式.
因此,我只是想知道它是否被拒绝.我不关心细节.
这是实际的测试:
[<Test>]
let ``Vending machine reflects more money required for selection``() =
// Setup
let balance = Quarter |> insert []
// Test
let display = balance |> select Pepsi …Run Code Online (Sandbox Code Playgroud) 我开始使用FsUnit来测试F#代码.它可以用F#样式表达断言,例如:
[<Test>]
member this.``Portugal voted for 23 countries in 2001 Eurovision contest``() =
this.totalVotes
|> getYearVotesFromCountry "Portugal" 2001
|> Seq.length
|> should equal 23
Run Code Online (Sandbox Code Playgroud)
注意我应该从FsUnit得到"应该等于23".以下是FsUnit如何定义它:
let equal x = new EqualConstraint(x)
对于浮点数,它并不那么简单.我必须使用EqualConstraint和Within方法.它自然适合C#:
Assert.That(result).Is.EqualTo(1).Within(0.05);
Run Code Online (Sandbox Code Playgroud)
当然我希望能用F#写:
result |> should equal 1 within 0.05
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我最终定义了一个新函数:
let almostEqual x = (new EqualConstraint(x)).Within(0.01)
Run Code Online (Sandbox Code Playgroud)
或者如果我想参数化精度,我可以将其指定为第二个参数:
let equalWithin x y = (new EqualConstraint(x)).Within(y)
Run Code Online (Sandbox Code Playgroud)
但它们都不漂亮.我想以更自然的方式为F#定义"内部"函数,因此它可以与相等的一起使用.F#不支持方法重载,因此看起来我无法以这种方式定义它,因此"相等"可以单独使用或与"内部"一起使用.
有任何想法吗?
我从FsUnit 项目页面复制了这个例子:
open NUnit.Framework
open FsUnit
let [<Test>] trivial () = 1 |> should not (equal 2)
Run Code Online (Sandbox Code Playgroud)
F#给我以下错误:
错误2此表达式应具有bool类型,但此处具有类型Constraints.EqualConstraint
错误1类型'bool'与'Constraints.Constraint'类型不兼容
我究竟做错了什么?
如何使用FsCheck实现多个参数生成?
我实现了以下内容以支持多个参数生成:
// Setup
let pieces = Arb.generate<Piece> |> Gen.filter (isKing >> not)
|> Arb.fromGen
let positionsList = Arb.generate<Space list> |> Arb.fromGen
Run Code Online (Sandbox Code Playgroud)
然后我使用这些参数来测试一个函数的行为,该函数负责为给定的检查器生成移动选项:
// Test
Prop.forAll pieces <| fun piece ->
Prop.forAll positionsList <| fun positionsItem ->
positionsItem |> optionsFor piece
|> List.length <= 2
Run Code Online (Sandbox Code Playgroud)
在管理多个生成的参数类型时,是否将Prop.forAll表达式嵌套为正确的技术?
是否有替代方法为被测函数生成多个参数?
这是整个功能:
open FsCheck
open FsCheck.Xunit
[<Property(QuietOnSuccess = true)>]
let ``options for soldier can never exceed 2`` () =
// Setup
let pieces = Arb.generate<Piece> |> Gen.filter (isKing >> not)
|> Arb.fromGen
let positionsList …Run Code Online (Sandbox Code Playgroud) 我正在摆弄一个新的F#项目(其中我没有做过很多),我的目标是以TDD方式进行.所以,我正在努力熟悉使用FsUnit,因为我在C#项目中使用NUnit有很多经验,而且它似乎是一个非常常见的框架.
我的代码如下所示:
module DatabaseReaderTest
open NUnit.Framework
open FsUnit
[<TestFixture>]
type DatabaseReaderTest ()=
[<Test>]
member x.ResultsAreReturnedFromDatabase =
DatabaseReader.result.GetSqlString(1) |> should equal "first"
Run Code Online (Sandbox Code Playgroud)
据我所知,这是在FsUnit主页(http://fsunit.codeplex.com/)上的示例,但编译器告诉我这[<Test>]不是这个语言元素的有效属性,我假设它是指会员.
关于我在这里做错了什么提示?
谢谢!
我想检查两个列表是否具有相同的成员,无论顺序如何:
let memCount items = items |> Seq.countBy id |> Map.ofSeq
let memberEquals items1 items2 = memCount items1 = memCount items2
Run Code Online (Sandbox Code Playgroud)
目前,我在测试中使用它,如下所示:
memberEquals expected actual |> should be True
Run Code Online (Sandbox Code Playgroud)
然而,这对于错误报告来说并不是那么好。
我可以扩展 FsUnit 以添加memberEquals类似的equalsorcontains吗?或者,我可以在比较列表之前先对列表进行排序。这里最好的方法是什么?
(我正在将 FsUnit 与 nUnit 一起使用,因为它的价值。)
我有以下代码,测试失败:
open Xunit
open FsUnit.Xunit
let rec openOrSenior xs =
match xs with
| head :: tail when fst head >= 55 && snd head >= 7 -> "Senior" :: openOrSenior tail
| head :: tail -> "Open" :: openOrSenior tail
| [] -> []
[<Fact>]
let ``empty input gives empty result``() =
openOrSenior [] |> should equal List.empty
Run Code Online (Sandbox Code Playgroud)
测试失败,出现以下匹配错误
FsUnit.Xunit + MatchException:抛出了类型'FsUnit.Xunit + MatchException'的异常.预期:等于[]
实际:是[]