🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
TestNG

TestNGは、Javaのためのテスティングフレームワーク。JUnitとNUnitにインスパイアを受け開発されました。ユニットテストに限らず、機能テストや統合テストも行うことが可能です。

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Q&A

解決済

1回答

596閲覧

Haskell(hspec) IOテスト方法(Couldn't match expected type ‘()’ with actual type ‘Either String b0’の解消方法)

nchika

総合スコア1

TestNG

TestNGは、Javaのためのテスティングフレームワーク。JUnitとNUnitにインスパイアを受け開発されました。ユニットテストに限らず、機能テストや統合テストも行うことが可能です。

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

0グッド

0クリップ

投稿2022/07/31 04:03

編集2022/07/31 05:30

前提

  • GHC: version 8.8.4
  • hspec: 2.10.0
  • OS: Ubuntu 22.04

実現したいこと

Haskellのhspecを用いたユニットテストで、IO出力する関数をテストすること。
(hspecのshouldReturnの使い方を間違えている可能性を疑っています)

発生している問題・エラーメッセージ

hspec公式ドキュメントを参考にテストを作成しましたが、エラーが発生します。

まず、テスト対象関数は、Falseモジュールで定義したversion関数です。

Haskell

1module False where 2 3-- |The 'version' print false command version. 4version :: IO () 5version = putStrLn "version 0.1.0"

次に、上記のFalse.version関数をテストするためにspecを定義しました。

Haskell

1module Main where 2 3import Test.Hspec 4import False 5 6main :: IO () 7main = hspec $ do 8 describe "false command unit test" $ do 9 it "print false command version" $ do 10 version `shouldReturn` Left "version 0.1.0"

この状態でテストを実施すると、以下のエラーが発生します。

/home/nao/Desktop/hs-coreutils/test/false/falseSpec.hs:10:36: error: • Couldn't match expected type ‘()’ with actual type ‘Either String b0’ • In the second argument of ‘shouldReturn’, namely ‘Left "version 0.1.0"’ In a stmt of a 'do' block: version `shouldReturn` Left "version 0.1.0" In the second argument of ‘($)’, namely ‘do version `shouldReturn` Left "version 0.1.0"’ | 10 | version `shouldReturn` Left "version 0.1.0" | ^^^^^^^^^^^^^^^^^^^^^ Progress 1/2

該当のソースコード

試したこと

  • 公式ドキュメント調査

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

version関数はIOをそのまま使ってしまっているのでそのままでは出力した文字列についてテストできません。直すにはいろいろなアプローチが考えられますが、今回はversion関数を一切修正しない、比較的お手軽な方法を紹介します。

拙作のmain-testerと言うパッケージを使えば、次のようにテストできるはずです:

haskell

1it "..." $ do 2 processResult <- captureProcessResult version 3 prStdout processResult `shouldBe` "version 0.1.0"

ただし、このmain-testerが提供するcaptureProcessResult関数は、標準出力・標準エラー出力をテストの結果としてしか使えなくしてしまうので、デバッグの際に困ることがある点にご注意ください。

詳しくは https://haskell.jp/blog/posts/2018/main-tester.html をご覧ください。

投稿2022/08/07 08:40

igrep

総合スコア433

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問