test-fixture alternatives and similar packages
Based on the "Testing" category.
Alternatively, view test-fixture alternatives based on common mentions on social networks and blogs.
-
hedgehog
Release with confidence, state-of-the-art property testing for Haskell. -
quickcheck-state-machine
Test monadic programs using state machine based models -
curl-runnings
A declarative test framework for quickly and easily writing integration tests against JSON API's. -
smallcheck
Test your Haskell code by exhaustively checking its properties -
ghc-prof-flamegraph
Generates data to be used with flamegraph.pl from .prof files. -
monad-mock
A Haskell package that provides a monad transformer for mocking mtl-style typeclasses -
test-framework
Framework for running and organising QuickCheck test properties and HUnit test cases -
fuzzcheck
A library for testing monadic code in the spirit of QuickCheck -
tasty-hedgehog
Tasty integration for the Hedgehog property testing library -
hspec-expectations-json
Hspec expectations on JSON Values -
should-not-typecheck
A HUnit/hspec assertion to verify that an expression does not typecheck -
hspec-golden-aeson
Use tests to monitor changes in Aeson serialization -
quickcheck-arbitrary-adt
Typeclass for generating a list of each instance of a sum type's constructors -
test-framework-th
Automagically (using Template Haskell) generates the Haskell-code you need when using HUnit -
tasty-expected-failure
Mark test cases as expected-failure -
test-framework-sandbox
test-sandbox support for the test-framework package -
markov-chain-usage-model
Computations for Markov chain usage models -
tasty-rerun
Rerun previous test suite runs to run only failing tests
ONLYOFFICE Docs โ document collaboration in your environment
Do you think we are missing an alternative of test-fixture or a related project?
README
test-fixture 
The test-fixture package is a Haskell library that makes it possible to easily write deterministic unit tests for code that encapsulates effects into monadic typeclasses. For example, given some typeclasses used to encapsulate effects:
class Monad m => MonadDB m where
fetchRecord :: DBRecord a => Id a -> m (Either DBError a)
insertRecord :: DBRecord a => a -> m (Either DBError (Id a))
class Monad m => MonadHTTP m where
sendRequest :: HTTPRequest -> m (Either HTTPError HTTPResponse)
One can write IO
instances to run the actual code in a real environment:
instance MonadDB IO where
fetchRecord = Postgres.fetchRecord
insertRecord = Postgres.insertRecord
instance MonadHTTP IO where
sendRequest = sendRequestIO
Then use those typeclasses to implement some sort of side-effectful function:
sendAndFetch :: (MonadDB m, MonadHTTP m, DBRecord a)
=> HTTPRequest -> m (Either AppError a)
sendAndFetch = ...
Testing this function might be difficult because of all the different possible combinations of scenarios that must be considered. Creating lots of different monads and instances for each case can be boilerplate-heavy and tedious. Using test-fixture, the boilerplate is unnecessary:
mkFixture "Fixture" [ts| MonadDB, MonadHTTP |]
spec = describe "sendAndFetch" $ do
it "returns a record when the http request and db fetch are successful" $ do
let (fixture :: Monad m => Fixture m) = def
{ _fetchRecord = \_ -> return $ Right procureRecord
, _sendRequest = \_ -> return $ Right responseOk
}
let result = unTestFixture (sendAndFetch simpleRequest) fixture
result `shouldBe` Right (User "[email protected]")
it "returns an error when the http request is not successful" $ do
let (fixture :: Monad m => Fixture m) = def
{ _fetchRecord = \_ -> return $ Right procureRecord
, _sendRequest = \_ -> return $ Left errorNotAuthorized
}
let result = unTestFixture (sendAndFetch simpleRequest) fixture
result `shouldBe` Left (AppHTTPError errorNotAuthorized)
For more information and a more complete explanation, see the documentation on Hackage.