问题标签 [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.

0 投票
1 回答
356 浏览

haskell - HSpec中的多个前功能?

我有一个可以通过调用此函数来创建的内存存储库:

whereInMemoryGameRepository定义如下:

在为我的 Scotty 应用程序编写测试时,我看到了使用这种方法的示例:

这一切都很好,但我还需要以某种方式初始化 InMemoryGameRepository(通过调用newEmptyRepository)并在我的测试中使用创建的实例。因此,我已更改app为:

我正在尝试创建一个使用存储库和的测试,IO Application例如像这样(不起作用):

wherestartGame定义如下:

在这里,编译器说(显然)repo不在范围内。但我怎样才能做到这一点?即我想在测试中共享 和 的单个newEmptyRepository实例app

Ps:你可以在github上看到完整的应用程序。

0 投票
1 回答
376 浏览

haskell - 如何使用 Hspec 编写数据驱动的测试?

我正在学习 Haskell,并成为一名优秀的开发人员,边走边写单元测试。我实现了各种排序算法和相应的测试。但是,我觉得单独的测试是多余的,因为输入和输出没有变化,只有用于对输入进行排序的算法是变化的。有没有办法在其他各种单元测试框架中尽可能地创建数据驱动测试或数据表?

此外,我收到以下警告,我想了解并消除这些警告。

0 投票
1 回答
338 浏览

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)

0 投票
1 回答
86 浏览

unit-testing - 检查每个 URL 在 Yesod 站点上的测试中有效

我试图检查 Yesod 网站主页上的所有链接是否有效。我写了这个 hSpec 测试。

一切都可以编译,但是该get函数摆脱了您提供给它的 URL 的主机部分。例如,当你给它时https://github.com/zigazou/bazasso,它会尝试获取/zigazou/bazasso返回 404 代码。

有没有办法让它像我想要的那样工作?

我应该添加一个从测试中删除外部链接的功能吗?

难道它根本就不是合适的地方吗?

0 投票
1 回答
171 浏览

haskell - 如何同时通过两个格式化程序记录 HSpec 测试输出?

我在本地和 CI 中运行我的 HSpec 测试。默认specdoc格式化程序产生漂亮的彩色标准输出。但是,对于 CI,我需要 XML 格式的结果,以便它们可以在 Web 上呈现。

我将我的 XML 格式添加到 HSpec 配置中,但这完全禁用了 stdio 输出。我已经尝试破解格式化程序,以便它运行两个格式化命令,但这只会产生一个包含混合文本和 XML 消息的 XML 文件(因为只有一个configOutputFile选项)。

此时的一些选择是:

  • 运行测试两次,每个格式化程序一次
  • 使用格式化程序运行测试,silent然后以某种方式尝试在结果上运行格式化程序。
  • 破解我的格式化程序输出,以便某些命令直接进入 stdio。

这些听起来都不是特别简单和直接。有没有更好的办法?一次只能使用一个格式化程序听起来像是一个相当烦人的限制。

0 投票
1 回答
986 浏览

haskell - 如何使用 QuickCheck 在范围内选择一个值?

我有以下代码用于在以下站点上创建挑战:codewars

我想将xprop_check 中的值设置为大于 4 的正整数,最大为五位数(不超过五位数,即:最大值 = 99999)。

我将如何接近它?

0 投票
1 回答
384 浏览

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!

0 投票
1 回答
97 浏览

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...

0 投票
1 回答
796 浏览

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找不到自己?

0 投票
3 回答
146 浏览

haskell - 测试是否在错误的环境中调用了 reader monad

我有一个MonadReader为我正在处理的应用程序生成数据的。这里的主要 monad 根据一些环境变量生成数据。monad 通过根据环境选择要运行的其他几个 monad 之一来生成数据。我的代码看起来有点像下面mainMonad的主要单子:

这里值得注意的是:

  • 我们有一个mainMonad既是 aMonadReader Environment又是 a 的主 monad ( ) MonadRandom
  • 主 monad 调用相同类型的从属monadAmonad monadB
  • 我们有第四个单子作为 和 的monadA助手monadB
  • monadB呼吁monadA(但用于local改变环境)

最重要的是:

  • 无论何时monadA或被helperA称为EnvironmentDataEnvironmentA,无论何时monadB被称为EnvironmentDataEnvironmentB

我的代码库几乎是这个的放大版本。有更多从属的 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 withReaderTMonadReader EnvironmentEnvironmentData


那么有没有一种方法可以确保我的 monad 总是从正确的环境中调用?