我尝试在Espec、PhoenixFramework和MongoDB应用程序中进行测试时的数据库清理
情况
在PhoenixFramework + MongoDB环境中进行API测试,每次测试都需要清理数据库,这一步麻烦极了。起初测试很少,所以我一个个地写清理代码,但渐渐地开始出现遗漏,所以我一直在寻找批量清理的方法。现在总算能对此进行处理了,我总结了下来。
环境
以下是中文本地版本的翻译:
Elixir 1.3.1
PhoenixFramework 1.2.0
Espec 0.8.28
EspecPhoenix 0.5.0
MongodbEcto 0.1.2
MongoDB 3.2.0
请提供解决方案。
在spec_helper.exs中设置Espec.configure,并在config.finally中执行MongoDB的命令,将collection删除。
请简要叙述。
由于EspecPhoenix的README中提供的示例是使用Ecto.Adapters.SQL.Sandbox.checkout/1,而由于我们在使用MongoDB,所以无法使用该方法。
因此,我尝试了一种强制的方法,即对每个处理过程进行DB drop操作。
ESpec.configure fn(config) ->
config.before fn ->
end
config.finally fn(shared) ->
Mongo.Ecto.command(YourApp.Repo, listCollections: 1) # collectionの一覧を取得
|> get_in(["cursor", "firstBatch"])
|> Enum.each(fn(x) ->
if x["name"] != "categories" do
Mongo.Ecto.command(YourApp.Repo, drop: x["name"]) # collectionを1つずつdrop
end
end)
end
end
禮物
在使用RDB(如MySQL、PostgreSQL等)环境时,可以使用EspecPhoenix的示例,非常方便。
ESpec.configure fn(config) ->
config.before fn(_tags) ->
:ok = Ecto.Adapters.SQL.Sandbox.checkout(YourApp.Repo)
end
config.finally fn(_shared) ->
Ecto.Adapters.SQL.Sandbox.checkin(YourApp.Repo, [])
end
end
总结一下
这种方法目前运行得很顺利,但是随着测试的增加,执行时间也会受到影响。那时应该如何应对呢?这是未来的问题。
由于MongoDB的适配器不支持Ecto2.0,所以Phoenix Framework + MongoDB的组合可能存在一些不确定因素,需要注意。
虽然MongodbEcto的0.1.4引入了一个可以截断所有集合的函数,但由于无法很好地解决与Ecto的依赖关系,无法引入。如果能解决这个问题,清理操作将更加轻松。