问题标签 [hspec]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - HSpec中的多个前功能?
我有一个可以通过调用此函数来创建的内存存储库:
whereInMemoryGameRepository
定义如下:
在为我的 Scotty 应用程序编写测试时,我看到了使用这种方法的示例:
这一切都很好,但我还需要以某种方式初始化 InMemoryGameRepository(通过调用newEmptyRepository
)并在我的测试中使用创建的实例。因此,我已更改app
为:
我正在尝试创建一个使用存储库和的测试,IO Application
例如像这样(不起作用):
wherestartGame
定义如下:
在这里,编译器说(显然)repo
不在范围内。但我怎样才能做到这一点?即我想在测试中共享 和 的单个newEmptyRepository
实例app
?
Ps:你可以在github上看到完整的应用程序。
haskell - 如何使用 Hspec 编写数据驱动的测试?
我正在学习 Haskell,并成为一名优秀的开发人员,边走边写单元测试。我实现了各种排序算法和相应的测试。但是,我觉得单独的测试是多余的,因为输入和输出没有变化,只有用于对输入进行排序的算法是变化的。有没有办法在其他各种单元测试框架中尽可能地创建数据驱动测试或数据表?
此外,我收到以下警告,我想了解并消除这些警告。
haskell - Hspec deal with two IO actions in Haskell
My question is whether there are ways to test two IO actions
in HSpec of Haskell?
Just something like the below example: (The below is wrong because of type)
unit-testing - 检查每个 URL 在 Yesod 站点上的测试中有效
我试图检查 Yesod 网站主页上的所有链接是否有效。我写了这个 hSpec 测试。
一切都可以编译,但是该get
函数摆脱了您提供给它的 URL 的主机部分。例如,当你给它时https://github.com/zigazou/bazasso
,它会尝试获取/zigazou/bazasso
返回 404 代码。
有没有办法让它像我想要的那样工作?
我应该添加一个从测试中删除外部链接的功能吗?
难道它根本就不是合适的地方吗?
haskell - 如何同时通过两个格式化程序记录 HSpec 测试输出?
我在本地和 CI 中运行我的 HSpec 测试。默认specdoc
格式化程序产生漂亮的彩色标准输出。但是,对于 CI,我需要 XML 格式的结果,以便它们可以在 Web 上呈现。
我将我的 XML 格式添加到 HSpec 配置中,但这完全禁用了 stdio 输出。我已经尝试破解格式化程序,以便它运行两个格式化命令,但这只会产生一个包含混合文本和 XML 消息的 XML 文件(因为只有一个configOutputFile
选项)。
此时的一些选择是:
- 运行测试两次,每个格式化程序一次
- 使用格式化程序运行测试,
silent
然后以某种方式尝试在结果上运行格式化程序。 - 破解我的格式化程序输出,以便某些命令直接进入 stdio。
这些听起来都不是特别简单和直接。有没有更好的办法?一次只能使用一个格式化程序听起来像是一个相当烦人的限制。
haskell - Hspec & QuickCheck - Ambiguous type variable a0?
I have written a function in Haskell that takes a list of arbitrary elements and returns (mapped) a list of tuples. Each tuple contains the original element and a fraction, with all the fractions in the list adding to 1 (therefore I simply calculate the fraction once using 1 ``div`` length xs
and apply it all elements). This is the code:
(Disclaimer: This is actually a slightly simplified version, but I am producing the exact same behaviour, so hopefully this suffices).
I am trying to cover this with a property based test using Hspec and Quickcheck:
However when I run this I get this error:
| 12 | it "produces a uniform distribution summing to 1" $ property $ | ^^^^^^^^^^...
I am guessing that somewhere I have not given QuickCheck enough information about how to generate the test value, but I am not sure where to go from here.
Any help would be greatly appreciated.
Thanks!
haskell - Testing with Hakyll's MonadMetadata
For our Hakyll codebase, I've written a few helper methods and have started adding some HSpec unit tests around newer ones e.g.:
Now creating an Item
or Identifier
for testing is easy enough, but I'm not sure where to go with the MonadMetadata
when running an Hspec.
I've seen testCompiler
which feels like it might be copyable / useful (Compiler
has a MonadMetadata
instance), but I'm out of my Haskell-depth here...
haskell - 找不到模块“Test.Hspec.Discover”
我是菜鸟。
我试图将一个更大的项目中的单个 Hspec/QuickCheck 测试复制并粘贴到我自己的项目中,以便我可以对其进行调整并查看它的行为方式。
我有一个像这样的结构:
Spec.hs
从我刚刚拥有的另一个项目复制:
这与文档中显示的示例完全相同:http: //hspec.github.io/hspec-discover.html
另外我在我的package.yml
:
当我运行时,stack test
我收到以下错误:
有很多我不明白的。但这里的主要难题是输出似乎显示hspec-discover-2.6.1
已成功安装。
我没有Test.Hspec.Discover
在我的代码中写任何地方,所以我必须假设错误来自{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
(错误消息也指向Spec.hs
源)。
嗯,我做错了什么?hspec-discover
找不到自己?
haskell - 测试是否在错误的环境中调用了 reader monad
我有一个MonadReader
为我正在处理的应用程序生成数据的。这里的主要 monad 根据一些环境变量生成数据。monad 通过根据环境选择要运行的其他几个 monad 之一来生成数据。我的代码看起来有点像下面mainMonad
的主要单子:
这里值得注意的是:
- 我们有一个
mainMonad
既是 aMonadReader Environment
又是 a 的主 monad ( )MonadRandom
。 - 主 monad 调用相同类型的从属
monadA
monadmonadB
。 - 我们有第四个单子作为 和 的
monadA
助手monadB
。 monadB
呼吁monadA
(但用于local
改变环境)
最重要的是:
- 无论何时
monadA
或被helperA
称为EnvironmentData
是EnvironmentA
,无论何时monadB
被称为EnvironmentData
是EnvironmentB
。
我的代码库几乎是这个的放大版本。有更多从属的 Monad(目前有 12 个,但将来可能会增加),有更多的助手,而且我的EnvironmentData
类型有点复杂(我的Environment
虽然几乎相同)。
最后一个要点很重要,因为EnvironmentData
在帮助程序中使用了 并且错误Environment
会导致帮助程序的结果发生细微的变化。
现在我的问题是很容易local
在我的代码中遗漏 a 并且直接在错误的环境中调用 monad。我也害怕在不使用的情况下调用 monad,local
因为我认为它期待一个它不是的环境。这些错误很小且很容易出错(我已经做过好几次了),而且这样做的结果通常是相当微妙和变化多端的。这最终使问题的症状很难通过单元测试来捕捉。所以我想直接针对问题。我的第一个直觉是在我的单元测试中添加一个子句,其中包含以下内容:
调用
mainMonad
检查在评估它的过程中,我们从来没有在错误的环境中调用过 monad。
这样我就可以发现这些错误,而不必非常仔细地梳理代码。现在在考虑了一会儿之后,我还没有想出一个非常简洁的方法来做到这一点。我想到了几种可行的方法,但我不太满意:
1. 错误环境调用硬崩溃
我可以通过在每个 monad 的前面添加一个条件来解决这个问题,如果它检测到它被错误的环境调用,就会硬崩溃。例如:
p>崩溃将在单元测试期间被捕获,我会发现问题。然而,这并不理想,因为我真的希望客户体验由于使用错误环境调用事物而导致的轻微问题,而不是在测试处理程序没有发现问题的情况下发生硬崩溃。这有点像核选项。这并不糟糕,但以我的标准和三者中最差的标准来说并不令人满意。
2.使用类型安全
我还尝试更改的类型,monadA
因此monadB
不能monadA
直接从中调用,monadB
反之亦然。这非常好,因为它可以在编译时捕获问题。这存在维护起来有点痛苦的问题,而且非常复杂。因为monadA
并且monadB
可能每个都共享许多类型的公共单子,所以(MonadReader m) => m Type
每个单子也必须被提升。真的,它几乎可以保证现在每条线路都有电梯。我不反对基于类型的解决方案,但我不想花费大量时间来维护单元测试。
3. 将局部变量移到声明的内部
每个对 有限制的 monadEnvironmentData
都可以从类似于以下的样板开始:
这很好,因为它确保始终使用正确的环境调用所有内容。然而,问题在于它以一种单元测试或类型证明没有的方式默默地“修复”错误。它真的只能防止我忘记local
。
3.5. 去除EnvironmentData
这个基本上等同于最后一个,虽然可能更干净一些。如果我将monadA
和的类型更改monadB
为
然后使用(如下面的Daniel Wagner所建议的)添加一个包装器到来自我的 s. 由于没有环境数据,我不能错误地称呼它们。这几乎与最后一个问题完全相同。runReaderT
withReaderT
MonadReader Environment
EnvironmentData
那么有没有一种方法可以确保我的 monad 总是从正确的环境中调用?