diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,8 @@
 # ChangeLog for yesod-test
 
+## 1.6.23
+
+* Add `MonadFail` to `SIO` so tests can fail on pattern match failure. [#1874](https://github.com/yesodweb/yesod/pull/1874)
 
 ## 1.6.22
 
diff --git a/Yesod/Test/Internal/SIO.hs b/Yesod/Test/Internal/SIO.hs
--- a/Yesod/Test/Internal/SIO.hs
+++ b/Yesod/Test/Internal/SIO.hs
@@ -8,6 +8,7 @@
 {-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE InstanceSigs #-}
 
 -- | The 'SIO' type is used by "Yesod.Test" to provide exception-safe
 -- environment between requests and assertions.
@@ -23,12 +24,18 @@
 import qualified Control.Monad.State.Class as MS
 import Yesod.Core
 import Data.IORef
+import GHC.Stack (HasCallStack)
 
 -- | State + IO
 --
 -- @since 1.6.0
 newtype SIO s a = SIO (ReaderT (IORef s) IO a)
   deriving (Functor, Applicative, Monad, MonadIO, MonadThrow, MonadUnliftIO)
+
+-- | @since 1.6.23
+instance MonadFail (SIO s) where
+  fail :: HasCallStack => String -> SIO s a
+  fail = error
 
 instance MS.MonadState s (SIO s)
   where
diff --git a/yesod-test.cabal b/yesod-test.cabal
--- a/yesod-test.cabal
+++ b/yesod-test.cabal
@@ -1,5 +1,5 @@
 name:               yesod-test
-version:            1.6.22
+version:            1.6.23
 license:            MIT
 license-file:       LICENSE
 author:             Nubis <nubis@woobiz.com.ar>
