2011-01-16 10 views
3

So versuche ich HTF zu verwenden, um einige hunit Stil BehauptungenWeirdness mit Kabale, HTF und hunit Behauptungen

% cat tests/TestDemo.hs 
{-# OPTIONS_GHC -Wall -F -pgmF htfpp #-} 
module Main where 
import Test.Framework 
import Test.HUnit.Base ((@?=)) 
import System.Environment (getArgs) 

-- just run some tests 
main :: IO() 
main = getArgs >>= flip runTestWithArgs Main.allHTFTests 

-- all these tests should fail 
test_fail_int1 :: Assertion 
test_fail_int1 = (0::Int) @?= (1::Int) 

test_fail_bool1 :: Assertion 
test_fail_bool1 = True @?= False 

test_fail_string1 :: Assertion 
test_fail_string1 = "0" @?= "1" 

test_fail_int2 :: Assertion 
test_fail_int2 = [0::Int] @?= [1::Int] 

test_fail_string2 :: Assertion 
test_fail_string2 = "true" @?= "false" 

test_fail_bool2 :: Assertion 
test_fail_bool2 = [True] @?= [False] 

Und laufen, wenn ich ghc --make verwenden, so scheint es richtig zu arbeiten.

% ghc --make tests/TestDemo.hs 
[1 of 1] Compiling Main    (tests/TestDemo.hs, tests/TestDemo.o) 
Linking tests/TestDemo ... 
% tests/TestDemoA 
... 
* Tests: 6 
* Passed: 0 
* Failures: 6 
* Errors: 0 

Failures: 
    * Main:fail_int1 (tests/TestDemo.hs:9) 
    * Main:fail_bool1 (tests/TestDemo.hs:12) 
    * Main:fail_string1 (tests/TestDemo.hs:15) 
    * Main:fail_int2 (tests/TestDemo.hs:19) 
    * Main:fail_string2 (tests/TestDemo.hs:22) 
    * Main:fail_bool2 (tests/TestDemo.hs:25) 

Aber wenn ich cabal verwende, um es zu bauen, scheitern nicht alle Tests, die ausfallen sollten.

% cat Demo.cabal 
... 
executable test-demo 
    build-depends: base >= 4, HUnit, HTF 
    main-is: TestDemo.hs 
    hs-source-dirs: tests 
% cabal configure 
Resolving dependencies... 
Configuring Demo-0.0.0... 
% cabal build 
Preprocessing executables for Demo-0.0.0... 
Building Demo-0.0.0... 
[1 of 1] Compiling Main    (tests/TestDemo.hs, dist/build/test-demo/test-demo-tmp/Main.o) 
Linking dist/build/test-demo/test-demo ... 
% dist/build/test-demo/test-demo 
... 
* Tests: 6 
* Passed: 3 
* Failures: 3 
* Errors: 0 

Failures: 
    * Main:fail_int2 (tests/TestDemo.hs:23) 
    * Main:fail_string2 (tests/TestDemo.hs:26) 
    * Main:fail_bool2 (tests/TestDemo.hs:29) 

Was läuft falsch und wie kann ich es beheben?

Antwort

3

Dies ist ein Fehler in bestimmten GHC-Versionen, der mit dem Optimierer zusammenhängt, der in einigen Fällen das Abwerfen von IO-Ausnahmen entfernt. Es ist sehr häufig mit Hunit-Code, wenn Optimierungen aktiviert sind. Und cabal setzt -O1 standardmäßig, was den Fehler aktiviert.

Das Upgrade auf GHC 7 behebt es (nicht wirklich empfohlen, bis Bibliotheken es eingeholt haben, IE eine Hakerk-Plattform-Release für GHC 7 gemacht wurde).

Sie können -O0 auch in den Compileroptionen in der .cabal-Dateizeilengruppe angeben, die sich auf Ihre Testdatei bezieht. Dies ist, was ich für meinen Testcode getan habe, bis ich bereit bin, mein Projekt auf GHC 7 zu verschieben.

+0

Eigentlich denke ich, das ist ein Bug in HUnit. Die Funktion 'assertFailure' sollte' throwIO' nicht 'throw' verwenden. Das wird GHC davon abhalten, Ausnahmen neu zu schreiben. – nominolo

Verwandte Themen