2013-04-09 36 views
1

如何在使用doctest和quickcheck时定义Arbitrary实例(如所述here)?如何在DocTest中使用带QuickTest的ByteStrings?

Doctest和Cabal按照here的描述进行设置,具有单独的测试目录。

的文档测试线看起来是这样的:

-- prop> (\s -> (decode . encode $ s == s)) :: ByteString -> Bool 
decode :: ByteString -> ByteString 
encode :: ByteString -> ByteString 

在哪里,我怎么定义Arbitrary实例,以便文档测试可以找到它? 请注意,我想在测试项目中定义它。

回答

3

尝试

-- $setup 
-- >>> import Control.Applicative 
-- >>> import qualified Data.ByteString as ByteString 
-- >>> import Test.QuickCheck 
-- >>> instance Arbitrary ByteString where arbitrary = ByteString.pack <$> arbitrary 
-- >>> instance CoArbitrary ByteString where coarbitrary = coarbitrary . ByteString.unpack 

-- | 
-- prop> \ s -> (decode . encode) s == s 
decode:: ByteString -> ByteString 
encode :: ByteString -> ByteString 

命名块可用于这样的定义。然而,每个完整的定义必须在一行上,doctest会将每次使用>>>报告为成功或失败 - 所以在这种情况下,将报告6次尝试,即使其中只有1次实际上是测试。

+0

问题是我不一定要在主项目上使用quickcheck依赖项。 – fho 2013-04-09 15:27:00

+1

'QuickCheck'依赖只应该在测试套件中。 – ScootyPuff 2013-04-09 15:42:37

+0

啊......我忽略了顶部的'$ setup'。这工作正常,谢谢! – fho 2013-04-09 17:38:01