haskell - 如何测试 Scotty 端点
问题描述
使用以下Scotty端点:
myendpoint :: Text -> ScottyM ()
myendpoint info =
post "/foo/bar/:var" $ do
var :: Text <- param "var"
query :: Query <- jsonData
result <- liftIO $ retrieveResult info var query
json $ result
runApi :: IO ()
runApi = scotty 4602 $ do
myendpoint
例如,如何myendpoint
使用不同的可能输入进行测试
info1 = "foo"
query1 = Query { qParam1 = "foo", qParam2 = "bar" }
var1 = "bar"
expect1 = Result { foo = "foo", bar = "bar" }
res1 = decode $ test_myendpoint info1 query1 var1
res1 `shouldBe` expect1
info2 = "baz"
query2 = Query { qParam1 = "hello", qParam2 = "there" }
var2 = "boo"
expect2 = Result { foo = "biz", bar = "dev" }
res2 = decode $ test_myendpoint info2 query2 var2
res2 `shouldBe` expect2
我很想在另一个线程中简单地运行 API,然后使用一些 JSON 查询端点,但是有没有更简洁的方法来做到这一点?(尽管上述的好处是真正的端到端测试)
解决方案
找到了答案。需要导入hspec-wai
和hspec-wai-json
.
然后,我们不直接运行 api,而是创建一个api
返回 的函数,IO Application
然后创建另一个runApi
实际运行该事物的函数。
import Network.Wai (Application)
import Network.Wai.Handler.Warp (run)
api :: IO Application
api = scottyApp $ do
myendpoint
runApi :: IO ()
runApi =
api >>= run 460
现在我们可以with api
在测试中自由使用:
import Test.Hspec
import Test.Hspec.Wai as W
import Test.Hspec.Wai.JSON
spec :: Spec
spec = with api $ do
describe "testing some endpoint" $ do
it "should return correct data" $ do
get "/foo/bar/whatever" `shouldRespondWith`
[json|{foo: "foo", bar: "bar"}|]
推荐阅读
- python - python中的回文函数没有返回预期结果
- mysql - 在查询中使用联合连接两个表
- excel - 行删除脚本 - 日期之间的比较不起作用
- sql - 如何获取与 ID 关联的所有时间戳并将其聚合为总时间?
- azure-cosmosdb - 确保 Cosmos db 中 SP 中操作/事务的原子性
- postgresql - 防止可能的 PostgreSQL GUC 参数竞争条件?
- c - 只能将 Char* 写入 LPVOID 缓冲区吗?
- python - 从 excel 创建数据框
- python - 我正在尝试调用一种方法来检查班级中的值,但仍然不断收到错误的输出
- python - Python 上的 ASCII 动画