Haskell 如何在YesSOD规范中执行待定规范

Haskell 如何在YesSOD规范中执行待定规范,haskell,yesod,hspec,Haskell,Yesod,Hspec,我是Yesod新手,我正在尝试在withApp块中添加一个挂起的规范(目前我只是尝试修改Yesod scaffholding生成的规范) 代码如下所示: appSpec::Spec appSpec::withApp$do 描述“getMyHandlerR”$do 这是“待办事项”$do 未决 但我收到了以下错误消息: Couldn't match type ‘(App, wai-3.2.0:Network.Wai.Middleware)’ with ‘()’ Exp

我是Yesod新手,我正在尝试在
withApp
块中添加一个挂起的规范(目前我只是尝试修改Yesod scaffholding生成的规范)

代码如下所示:

appSpec::Spec appSpec::withApp$do 描述“getMyHandlerR”$do 这是“待办事项”$do 未决

但我收到了以下错误消息:

Couldn't match type ‘(App, wai-3.2.0:Network.Wai.Middleware)’
               with ‘()’
Expected type: SpecWith (TestApp App)
  Actual type: SpecWith (Arg Expectation)
In a stmt of a 'do' block: it "todo" $ do { pending }
In the second argument of ‘($)’, namely
  ‘do { it "todo" $ do { pending } }’
In a stmt of a 'do' block:
  describe "upload a file without error"
  $ do { it "todo" $ do { pending } }

如果我用app删除
,一切正常。我理解
withApp
正在以某种方式改变预期的类型,但是
描述
它的类型是正确的,而
挂起的
没有?

将我的评论复制到回答中:


我认为您只需要通过以下方式抛弃
TestApp应用程序
参数:

it "todo" $ \_ -> pending

添加一个
ypending
或等效项难道不值得吗


对我来说这听起来是个好主意,实际上我从未亲自使用过
pending
,这就是为什么我从未想到过它。您能否发送一份PR以将其包括在内?

最新的YesSOD对我来说就像一个符咒:

it "should x" $ do
  liftIO pending

我想你只需要通过
it“todo”$\\\->pending
it“todo”$const pending来扔掉
TestApp
参数,我可以确认@MichaelSnoyman的修复工作哇,它确实有效。我试过了,但没有成功。我仍然感到惊讶的是,
it“pending
withApp
之外工作,但在app
内部不工作,可能存在某种类型推断魔法@MichaelSnoyman你能把它作为一个答案贴出来让我接受吗?添加一个
ypending
或等效项难道不值得吗?我很乐意为它做一个pull请求。然而,它是否应该像yit一样?我仍然不明白为什么正常的挂起dosenst在正常的it块(不是yit块)中工作,因为
挂起的类型是
期望值,即
IO()
,不允许额外的参数。我不完全理解hspec中的类型魔法,但它是存在的。我看了一下,它比我想的更复杂。执行
ypending=const pending
yit
上下文中不起作用,反正我没有使用它。我对yit有足够的了解,现在可以做任何事情。Hspec中涉及到类型家族,这就解释了它的神奇之处。也许可以用App
从脚手架上修改
,以便在没有const的情况下接受挂起。这是一个比OPs更普遍的问题,我花了几个小时与OPs抗争,试图让独立于App的测试正常工作,如果可能的话,我的新手同事可以在测试相关文档时访问它!
it "should x" $ do
  liftIO pending