0

さて、複数のテストケースをセットアップして、最後にグループ化しました。 コードの一部をアップするのを忘れていたので、追加しました

問題は、たとえばMain>tests 1と入力 すると正しい答えが表示されますが、main>test0などのテスト ケースを個別に実行しようとすると、出力が "TestCase _" になることです。

またはmain>Alltests私の出力は " TestList [TestLabel test1 TestCase _,TestLabel test0 TestCase _,TestLabel test7 TestCase _,TestLabel est51 TestCase _] " です

私の質問は、_の原因と、テストケースを認識しない理由です

assertException :: (Exception e, Eq e) => e -> IO a -> IO ()
assertException ex action =
      handleJust isWanted (const $ return ()) $ do
            action
            assertFailure $ "Expected exception: " ++ show ex
     where isWanted = guard . (== ex) 

assertError ex f = 
      assertException (ErrorCall ex) $ evaluate f



tests :: Integer -> [Integer]

tests n | n == 0              = error "Not positive"
        | n == 1              = [1]
        | (n `div` 2 == 0)    = n:tests(n*2)
        | otherwise           = n:tests(3*n) 



test0 = 
      TestCase ( assertError
                    "tests 0" 
                     ( tests 0 )
               )


test7 = 
      TestCase ( assertEqual
                    "tests 7" 
                [7,18,9]
                     ( tests 7 )
                )

test51 = 
      TestCase ( assertEqual
                    [9,8,9]
                    "tests 51"

                  ( tests 51 )
               )



alltests = 
     TestList [
             -- TestLabel "test1" test1
               TestLabel "test0" test0
             , TestLabel "test7" test7
             , TestLabel "test51"test51
             ]
4

2 に答える 2

6

test0プロンプトでor allTests(注: コンストラクターではないため、大文字で始めることはできません) を入力しても、実際にはテストは実行されません。test0型の値でもTestありallTestsます。したがって、これらのいずれかを ghci プロンプトで入力すると、その値がStringviashowに変換され、String出力されます。

anは-actionであるため、のShowインスタンスは含まれているs を意味のあるものにTest変換できません。したがって、「ここにアサーションがある」ことを示すために、一般的にアンダースコアが表示されます。AssertionStringAssertionIO

tests 1

一方、 は typeの式であり、プロンプトでそのような式を入力すると、 (型変数をデフォルトでに修正した後)ビアtests 1 :: Integral a => [a]に変換されすぎますが、ここでは、インスタンスはリストを完全に評価する必要があります。 .StringshowaIntegerShow

実際にテストを実行するには、runTestTTor performTest(または HUnit の他のテストランナーの 1 つ) が必要です。

于 2012-12-03T14:39:24.590 に答える
1

最初に、あなたのコードはめちゃくちゃだと言わざるを得ません。あなたは、コピーによってフォーマットが台無しになったと書いていますが、それでも、問題に対するよく書かれた解決策が本当に必要な場合は、よく書かれた質問も書くとよいでしょう。ただし、実際にコードを実行するにはいくつかの変更が必要です。

例: の定義では、存在しないtest0という関数を使用しているため、他のテスト ケースと同じように意味すると思います。テスト ケースのもう 1 つの問題は、 functionの使用法です。3 つの引数を取りますが、定義では 2 つしか取得できません。後の 2 つの引数は、期待される値と実際の値を表します。実際の値を忘れてしまったのでしょう。何をテストしたいのかわかりません。assertErrorassertEqualassertEqual :: (Eq a, Show a) => String -> a -> a -> Assertion

編集:しかし、関数と対応するテストの問題は、関数が無限リストを構築することであると思います(0または1の入力値としてを除くn)。そのため、関数はテストケースと同様に終了しません。(私は最初、これが不可解な出力の理由でもあると考えましたが、これは間違っているようです。)

于 2012-12-03T14:39:12.950 に答える