Tôi không thể tìm thấy bất kỳ thứ gì trong API QuickCheck để thực hiện điều này một cách tốt đẹp, nhưng đây là điều tôi đã tấn công cùng nhau bằng API QuickCheck đơn thuần. Nó chặn và ghi lại các yếu tố đầu vào vào tài sản của bạn theo số IORef
và giả định rằng nếu không thành công, mục cuối cùng là thủ phạm và trả lại số tiền đó theo số Just
. Nếu thử nghiệm được thông qua, kết quả là Nothing
. Điều này có thể được tinh chỉnh một chút nhưng đối với các thuộc tính một đối số đơn giản, nó sẽ thực hiện công việc.
import Control.Monad
import Data.IORef
import Test.QuickCheck
import Test.QuickCheck.Monadic
prop_failIfZero :: Int -> Bool
prop_failIfZero n = n /= 0
quickCheck' :: (Arbitrary a, Show a) => (a -> Bool) -> IO (Maybe a)
quickCheck' prop = do input <- newIORef Nothing
result <- quickCheckWithResult args (logInput input prop)
case result of
Failure {} -> readIORef input
_ -> return Nothing
where
logInput input prop x = monadicIO $ do run $ writeIORef input (Just x)
assert (prop x)
args = stdArgs { chatty = False }
main = do failed <- quickCheck' prop_failIfZero
case failed of
Just x -> putStrLn $ "The input that failed was: " ++ show x
Nothing -> putStrLn "The test passed"
rất thông minh, cảm ơn – Xodarap
Mẹo nhỏ này đã làm cho trải nghiệm gỡ lỗi Haskell của tôi tốt hơn rất nhiều. Cảm ơn –