8

現在、次のテストコードがあります。

testUpdate :: Test
testUpdate = testCase "update does change artist" $ do
  (created, Just revised, parents) <- mbTest $ do
    Just editor <- fmap entityRef <$> findEditorByName "acid2"

    created <- create editor startWith
    let artistId = coreMbid created

    newRev <- update editor (coreRevision created) expected

    editId <- openEdit
    includeRevision editId newRev
    apply editId

    found <- findLatest artistId
    parents <- revisionParents newRev

    return (created, found, parents)

  coreData revised @?= expected

  assertBool "The old revision is a direct parent of the new revision" $
    parents == [coreRevision created]

  where
    startWith = ...
    expected = ...

これはちょっとうまくいきますが、面倒です。テスト中のさまざまなものを返さなくても何かを書くことができ、代わりにそれらが意味を成すアサーションを持つことができればよいのです。

クラスがあるAssertableようですが、おそらくたくさんのものを再発明する必要があるようです。

4

1 に答える 1

1

純粋なIO aであるtype の IO 計算をモナドに返させないのはなぜですか? あなたのコメントのように、モナドが MonadIO のインスタンスである場合は簡単なので、モナドが純粋な計算を許可すると仮定します。

newtype M a = M {runM :: ....}
instance Monad M where
  ...

makeTest :: M Assertion
makeTest = do
    created <- ..
    found   <- ..
    parents <- ..
    let test1 = coreData revised @?= expected
    ...
    let test2 = assertBool "The old revision..." $
                   parents == [coreRevision create]

    return $ test1 >> test2

testUpdate :: Test
testUpdate = testCase "update does change artist" $ runM makeTest

おまけに、リストモナドの場合と同様に、1 つのモナド計算でテストのコレクションを返すことができます。

于 2012-11-10T08:11:11.767 に答える