标签: fsunit

FsUnit`应该等于`失败了`Some []`

当我使用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相同,测试也会失败.发生了什么?

f# nunit fsunit

4
推荐指数
1
解决办法
671
查看次数

为什么NUnit测试适配器找不到我的FsUnit测试?

我正在使用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)

f# nunit visual-studio fsunit test-explorer

4
推荐指数
1
解决办法
584
查看次数

如何在FsUnit的断言中忽略受歧视的并集案例的价值?

如何在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)

f# fsunit

4
推荐指数
1
解决办法
101
查看次数

FsUnit并检查浮点数的相等性

我开始使用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#不支持方法重载,因此看起来我无法以这种方式定义它,因此"相等"可以单独使用或与"内部"一起使用.

有任何想法吗?

f# nunit fsunit

3
推荐指数
1
解决办法
618
查看次数

FsUnit示例出错

我从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'类型不兼容

我究竟做错了什么?

f# fsunit

3
推荐指数
1
解决办法
489
查看次数

如何使用FsCheck实现多个参数生成?

如何使用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# fscheck fsunit

3
推荐指数
1
解决办法
248
查看次数

使用FsUnit创建测试类时,[<Test>]不是成员的有效属性.为什么?

我正在摆弄一个新的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>]不是这个语言元素的有效属性,我假设它是指会员.

关于我在这里做错了什么提示?

谢谢!

f# fsunit

2
推荐指数
1
解决办法
504
查看次数

列出 FsUnit 中的成员相等性

我想检查两个列表是否具有相同的成员,无论顺序如何:

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 一起使用,因为它的价值。)

f# unit-testing fsunit

1
推荐指数
1
解决办法
545
查看次数

单元测试:'[] |>应该等于List.empty'不能按预期工作

我有以下代码,测试失败:

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'的异常.预期:等于[]
实际:是[]

f# xunit pattern-matching fsunit

1
推荐指数
2
解决办法
231
查看次数