2015-11-09 58 views
1

TLDR:是否可以使用模塊重新導出來避免「暴露」所有可測試模塊?單元測試:模塊重新導出可避免必須「暴露」所有可測試模塊

我對我的Haskell項目使用了類似於Chris Done模板的東西。我ventureforth.cabal文件有以下幾個部分:

library 
    hs-source-dirs:  src 
    exposed-modules:  VForth, 
         VForth.Location 
    build-depends:  base >= 4.7 && < 5 
    ghc-options:   -Wall -Werror 
    default-language: Haskell2010 

executable ventureforth 
    hs-source-dirs:  app 
    main-is:    Main.hs 
    build-depends:  base >= 4.7 && < 5, 
         ventureforth -any 
    ghc-options:   -Wall -Werror -threaded -rtsopts -with-rtsopts=-N 
    default-language: Haskell2010 

test-suite ventureforth-test 
    type:    exitcode-stdio-1.0 
    hs-source-dirs:  test 
    main-is:    Spec.hs 
    build-depends:  base >= 4.7 && < 5, 
         ventureforth -any, 
         doctest >= 0.9 && < 0.11, 
         hspec -any 
    ghc-options:   -Wall -Werror -threaded -rtsopts -with-rtsopts=-N 
    default-language: Haskell2010 

我的代碼佈局爲

ventureforth/ 
| 
+- ventureforth.cabal 
+- app/ 
| | 
| +- Main.hs 
| 
+- src/ 
| | 
| +- VForth.hs 
| +- VForth/ 
|  | 
|  +- Location.hs 
| 
+- test/ 
| | 
| +- Spec.hs 
| +- VForth 
|  | 
|  +- LocationSpec.hs 

我已經設置了VForth.hs再出口VForth.Location

module VForth (
    module VForth.Location 
) where 

import VForth.Location 

而在VForth.LocationSpec單元測試我只需要import VForth來測試Location類型。

但是,除非將「VForth.Location」添加到「公開模塊」列表中,否則嘗試運行cabal test時會遇到鏈接器錯誤。

我曾經想過公開一個模塊,VForth,它重新導出所有其他模塊,已經足夠了。我真的陷入了必須列出cabal中的每個源文件的情況嗎?

+1

如果您不想公開某個模塊,則仍需將其包含在「other-modules」部分。除此之外,是的,你堅持列出cabal文件中的每個模塊。用戶指南中的相關行:[「軟件包中的每個模塊必須列在其中一個模塊,外露模塊或主要字段中。」](https://downloads.haskell.org/~ghc/7.0 .4/docs/html/Cabal/authors.html#buildinfo) – user2407038

+0

這似乎真的很笨重。我是否認爲我的項目佈局遵循Haskell最佳實踐?我真的會在Cabal中列出每個源文件嗎? – Feenaboccles

回答

1

所以最後這是不可避免的。然而,經過反思,這也是一種好的行爲。由於我創建了一個庫,並且Haskell語言無法控制模塊的可見性,所以我必須指定哪些模塊要在Cabal中導出。

爲了起到測試的作用,我的測試不應該對我的庫客戶端所做的應用程序有任何額外的訪問權限。因此,我的測試無法訪問我的庫的客戶端無法訪問的任何模塊也是可以接受的。

然而,在實踐中,我會想要測試哪些內部元素未暴露。因此,我將測試套件分爲兩個,一個內部測試套件和另一個外部測試套件,測試這些不同的方面。

test-suite ventureforth-test-external 
    type:    exitcode-stdio-1.0 
    hs-source-dirs:  test 
    main-is:    Spec.hs 
    build-depends:  base >= 4.7 && < 5, 
         ventureforth -any, 
         hspec -any 
    ghc-options:   -Wall -Werror -threaded -rtsopts -with-rtsopts=-N 
    default-language: Haskell2010 

test-suite ventureforth-test-internal 
    type:    exitcode-stdio-1.0 
    hs-source-dirs:  test,src 
    main-is:    Spec.hs 
    build-depends:  base >= 4.7 && < 5, 
         hspec -any 
    ghc-options:   -Wall -Werror -threaded -rtsopts -with-rtsopts=-N 
    default-language: Haskell2010 

內部測試可以直接訪問源代碼,所以不會導入庫。

最後「內部」測試的第二個來源,我還使用文檔測試,如Haskeleton project setup guide

最後描述,爲別人構建一個Haskell項目,請注意,您可以使用Haskell Init tool創建在同名目錄中稱爲my-project-name所有的測試位,並設置了鮑勃和準備的骨架項目去

hi my-project-name \ 
    --repository git://github.com/tfausak/haskeleton.git \ 
    --package-name my-project-name \ 
    --module-name MyProjectName \ 
    --author Bryan Feeney \ 
    --email [email protected] 

信息庫標誌給出的模板項目的路徑。 Haskeleton模板包含單元測試,文檔測試和基準測試。在HI templates page上可以找到其他項目tempaltes,例如網絡應用程序。要安裝Haskell Init工具,只需鍵入

cabal install hi