我在 Elixir 中有一個非常簡單的應用程式,它使用 Ecto,在 Postgres 上的表中運行 SELECT 查詢。表名為“person”,有 2 列:“name”和“age”。
這是應用程式:
/ecto_app
|-application.ex
|-repo.ex
應用程式.ex:
defmodule EctoApp.Application do
use Application
require Logger
@impl true
def start(_type, _args) do
children = [
EctoApp.Repo
]
opts = [strategy: :one_for_one, name: EctoApp.Supervisor]
Logger.debug("Starting Ecto App")
Supervisor.start_link(children, opts)
end
end
回購.ex:
defmodule EctoApp.Repo do
use Ecto.Repo,
otp_app: :ecto_app,
adapter: Ecto.Adapters.Postgres
import Ecto.Query
require Logger
def get_people() do
query = from p in "person",
select: [p.name, p.age]
result= EctoApp.Repo.all(query)
Logger.debug(result)
end
end
我正在使用這兩個庫:
[
{:ecto_sql, "~> 3.0"},
{:postgrex, ">= 0.0.0"}
]
該應用程式運行良好,但問題是我想為 repo 進行單元測驗,但我不知道如何模擬 Postgres 連接,因為我不想啟動 Postgres 實體來運行測驗。
有誰知道如何模擬或我可以使用哪個庫來“模擬”與 Postgres 的連接,這樣我就可以對 repo 類進行測驗覆寫?
謝謝!
uj5u.com熱心網友回復:
您不需要像模擬其他功能一樣模擬 PostGres 連接。這是因為 PostGres 可以將操作包裝在可撤消的事務中。要點是您的測驗使用真實連接并對真實資料庫發出真實請求,但該資料庫專用于通過特殊配接器進行測驗和發出查詢。這是迄今為止為資料庫支持的應用程式實作測驗覆寫率的最常見方法;嘗試模擬資料庫連接會導致脆弱的測驗充滿誤報,因此通常不會這樣做,尤其是當針對真實資料庫發出所有請求如此簡單時。
以下是在您的代碼中促進這一點的重要部分:
- 在您的應用配置中指定沙盒配接器和專用測驗資料庫,例如通過組態檔:
# config/dev.exs
config :my_app, MyApp.Repo,
pool: DBConnection.ConnectionPool,
database: "something_dev",
# ... etc...
# config/test.exs
config :my_app, MyApp.Repo,
pool: Ecto.Adapters.SQL.Sandbox,
database: "something_test",
# ... etc...
- 您的測驗必須
Repo在運行查詢之前檢查是否使用了配接器。這就是將操作包裝在事務中的內容,因此您可以安全地重新運行測驗而無需過度清理。一個很好的地方是setup callback,它在模塊中的每個測驗之前運行:
defmodule MyApp.SomeTest do
use ExUnit.Case # you may require async: false
alias Ecto.Adapters.SQL.Sandbox
alias MyApp.Repo
setup do
Sandbox.checkout(Repo)
end
describe "get_people/0" do
test "select" do
# insert fake records here
assert [] = Repo.get_people()
end
end
end
還有幾個指標:
如所寫,您的
get_people/0函式不會回傳result. 請記住,Elixir 依賴于隱式回傳,因此它回傳最后一次操作的結果。在您的情況下,回傳的內容將是除錯陳述句的結果,這只是您所期望的,:ok而不是result您所期望的。不要忘記您可能需要針對您的測驗資料庫運行遷移——這不是自動發生的事情。您可以在您的別名中創建一個別名以在測驗之前
mix.exs執行mix ecto.migrate,或者您可以只記得MIX_ENV=test mix ecto.drop針對測驗資料庫運行等。您經常會發現自動構建資料“夾具”很有幫助,即以適當的形狀偽造記錄。ex_machina包是一種方便的方法,但無論您使用包還是滾動自己的固定裝置,您的測驗都需要使用您期望的任何測驗記錄來準備資料庫,作為標準中“安排”步驟的一部分“安排-行動-斷言”測驗方法。
如果您的情況確實需要模擬資料庫連接,那么我會推薦一種依賴于“依賴注入”的簡單模式,例如,您可以將Repo模塊作為函式引數或從配置中提取的內容覆寫,例如
def get_people(repo \\ Repo)
query = from p in "person",
select: [p.name, p.age]
repo.all(query)
end
uj5u.com熱心網友回復:
我建議在容器中運行 PostgreSQL,然后使用 Ecto Sandbox。https://hexdocs.pm/ecto_sql/Ecto.Adapters.SQL.Sandbox.html
uj5u.com熱心網友回復:
外帶有自己的測驗套件,并且有關于如何使用 Ecto 進行測驗的專用檔案。
Ecto.Adapters.SQL.Sandbox將用于測驗,但無法避免啟動實際的資料庫實體,主要是因為使用模擬連接進行測驗幾乎沒有意義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/460500.html
標籤:PostgreSQL 单元测试 灵丹妙药 外
下一篇:開玩笑的測驗用例反應失敗
