我有一个可以通过调用此函数来创建的内存存储库:
newEmptyRepository :: IO InMemoryGameRepository
whereInMemoryGameRepository
定义如下:
type State = (HashMap GameId Game)
type IORefState = IORef State
newtype InMemoryGameRepository = InMemoryGameRepository IORefState
在为我的 Scotty 应用程序编写测试时,我看到了使用这种方法的示例:
spec =
before app $ do
describe "GET /" $ do
it "responds with 200" $ get "/" `shouldRespondWith` 200
it "responds with 'hello'" $ get "/" `shouldRespondWith` "hello"
...
这一切都很好,但我还需要以某种方式初始化 InMemoryGameRepository(通过调用newEmptyRepository
)并在我的测试中使用创建的实例。因此,我已更改app
为:
app :: InMemoryGameRepository -> IO Application
app repo = scottyApp $ routes repo
我正在尝试创建一个使用存储库和的测试,IO Application
例如像这样(不起作用):
spec =
before (do repo <- newEmptyRepository
app repo) $
-- API Tests
describe "GET /api/games" $
it "responds with " $ do
liftIO $ startGame repo
get "/api/games" `shouldRespondWith` singleGameResponse
wherestartGame
定义如下:
startGame :: InMemoryGameRepository -> IO Game
在这里,编译器说(显然)repo
不在范围内。但我怎样才能做到这一点?即我想在测试中共享 和 的单个newEmptyRepository
实例app
?
Ps:你可以在github上看到完整的应用程序。