Pular para o conteúdo
Skillpedia
Testes280 mil · #59

fsharp-testing

Implementa testes em F# usando xUnit e outras ferramentas, garantindo a qualidade e robustez do código.

O que ela faz

Esta 'skill' ajuda você a escrever testes para seu código F#. Ela mostra como usar ferramentas populares como xUnit, FsUnit, Unquote e FsCheck para garantir que seu código funcione como esperado.

Quando usar

  • ✓Quando você está escrevendo novos testes para seu código F#.
  • ✓Ao revisar a qualidade e a cobertura dos testes existentes.
  • ✓Para configurar a estrutura de testes em projetos F#.

Exemplo do que pedir para a IA

“Como posso escrever um teste básico para verificar se um pedido é criado com o status 'Pendente' em F#?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/fsharp-testing/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/fsharp-testing/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

A 'skill' usa frameworks de teste como xUnit e bibliotecas como FsUnit e Unquote para definir testes. Para testes mais avançados, ela demonstra o uso de FsCheck para testes baseados em propriedades e NSubstitute para simular dependências.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill fsharp-testing

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/fsharp-testing/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões de Teste em F#

Padrões abrangentes de teste para aplicações F# usando xUnit, FsUnit, Unquote, FsCheck e práticas modernas de teste do .NET.

Quando Ativar

  • Escrevendo novos testes para código F#
  • Revisando a qualidade e cobertura dos testes
  • Configurando a infraestrutura de testes para projetos F#
  • Depurando testes instáveis ou lentos

Pilha de Frameworks de Teste

Ferramenta Propósito
xUnit Framework de teste (escolha padrão do ecossistema .NET)
FsUnit.xUnit Sintaxe de asserção amigável para F# para xUnit
Unquote Biblioteca de asserção usando citações F# para mensagens de falha claras
FsCheck.xUnit Teste baseado em propriedades integrado com xUnit
NSubstitute Mocking de dependências .NET
Testcontainers Infraestrutura real em testes de integração
WebApplicationFactory Testes de integração ASP.NET Core

Testes Unitários com xUnit + FsUnit

Estrutura Básica de Teste

module OrderServiceTests

open Xunit
open FsUnit.Xunit

[<Fact>]
let ``create sets status to Pending`` () =
    let order = Order.create "cust-1" [ validItem ]
    order.Status |> should equal Pending

[<Fact>]
let ``confirm changes status to Confirmed`` () =
    let order = Order.create "cust-1" [ validItem ]
    let confirmed = Order.confirm order
    confirmed.Status |> should be (ofCase <@ Confirmed @>)

Asserções com Unquote

Unquote usa citações F# para que as mensagens de falha mostrem a expressão completa que falhou, não apenas "esperado X, obtido Y".

module OrderValidationTests

open Xunit
open Swensen.Unquote

[<Fact>]
let ``PlaceOrder returns success when request is valid`` () =
    let request = { CustomerId = "cust-123"; Items = [ validItem ] }
    let result = OrderService.placeOrder request
    test <@ Result.isOk result @>

[<Fact>]
let ``order total sums item prices`` () =
    let items = [ { Sku = "A"; Quantity = 2; Price = 10m }
                  { Sku = "B"; Quantity = 1; Price = 5m } ]
    let total = Order.calculateTotal items
    test <@ total = 25m @>

[<Fact>]
let ``validated email rejects empty input`` () =
    let result = ValidatedEmail.create ""
    test <@ Result.isError result @>

Testes Assíncronos

[<Fact>]
let ``PlaceOrder returns success when request is valid`` () = task {
    let deps = createTestDeps ()
    let request = { CustomerId = "cust-123"; Items = [ validItem ] }

    let! result = OrderService.placeOrder deps request

    test <@ Result.isOk result @>
}

[<Fact>]
let ``PlaceOrder returns error when items are empty`` () = task {
    let deps = createTestDeps ()
    let request = { CustomerId = "cust-123"; Items = [] }

    let! result = OrderService.placeOrder deps request

    test <@ Result.isError result @>
}

Testes Parametrizados com Theory

[<Theory>]
[<InlineData("")>]
[<InlineData("   ")>]
let ``PlaceOrder rejects empty customer ID`` (customerId: string) =
    let request = { CustomerId = customerId; Items = [ validItem ] }
    let result = OrderService.placeOrder request
    result |> should be (ofCase <@ Error @>)

[<Theory>]
[<InlineData("", false)>]
[<InlineData("a", false)>]
[<InlineData("user@example.com", true)>]
[<InlineData("user+tag@example.co.uk", true)>]
let ``IsValidEmail returns expected result`` (email: string, expected: bool) =
    test <@ EmailValidator.isValid email = expected @>

Teste Baseado em Propriedades com FsCheck

Usando FsCheck.xUnit

open FsCheck
open FsCheck.Xunit

[<Property>]
let ``order total is always non-negative`` (items: NonEmptyList<PositiveInt * decimal>) =
    let orderItems =
        items.Get
        |> List.map (fun (qty, price) ->
            { Sku = "SKU"; Quantity = qty.Get; Price = abs price })
    let total = Order.calculateTotal orderItems
    total >= 0m

[<Property>]
let ``serialization roundtrips`` (order: Order) =
    let json = JsonSerializer.Serialize order
    let deserialized = JsonSerializer.Deserialize<Order> json
    deserialized = order

Geradores Personalizados

type OrderGenerators =
    static member ValidEmail () =
        gen {
            let! user = Gen.elements [ "alice"; "bob"; "carol" ]
            let! domain = Gen.elements [ "example.com"; "test.org" ]
            return $"{user}@{domain}"
        }
        |> Arb.fromGen

[<Property(Arbitrary = [| typeof<OrderGenerators> |])>]
let ``valid emails pass validation`` (email: string) =
    EmailValidator.isValid email

Mocking de Dependências

Stubs de Função (Preferencial)


…
Perguntas frequentes

O que são testes baseados em propriedades?

São testes que verificam se uma propriedade do seu código se mantém verdadeira para uma variedade de entradas geradas automaticamente, em vez de testar entradas específicas.

O que é 'mocking' ou simulação?

É criar versões falsas de outras partes do seu programa para testar uma parte isoladamente. Por exemplo, simular um banco de dados para testar a lógica de pedidos.

Por que usar Unquote em vez de FsUnit?

Unquote oferece mensagens de erro mais detalhadas quando um teste falha, mostrando exatamente qual parte da expressão causou o problema.

Detalhes

Descrição original do autor

F# testing patterns with xUnit, FsUnit, Unquote, FsCheck property-based testing, integration tests, and test organization best practices. Use when writing F# tests with xUnit, FsUnit, Unquote, or FsCheck.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#59
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas