質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
86.12%
TestNG

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

Haskell

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

解決済

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

nchika
nchika

総合スコア1

TestNG

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

Haskell

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

1回答

0グッド

0クリップ

272閲覧

投稿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

該当のソースコード

試したこと

  • 公式ドキュメント調査

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

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

総合スコア423

nchika👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

TestNG

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

Haskell

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