Techioz Blog

Minitest::Assertion: “User.count” は 1 ではなく 0 だけ変化しました

概要

test "should create user" do
    assert_difference("User.count", +1) do
      post users_url, params: { user: { email: @user.email, name: @user.name } }
    end
  end
  test "should create another user" do
      assert_difference("User.count", +1) do
        post users_url, params: { user: { email: "[email protected]", name: @user.name } }
      end

エラーは何ですか? Minitest::Assertion: “User.count” は 1 ではなく 0 だけ変化しました。 予想: 4 実際: 3

解決策

このテストでは、指定されたパラメーターを使用して users_url への POST リクエストを実行すると、データベース内のユーザーの数が 1 つ増加することが指定されています。

エラーメッセージには次のように書かれています。

Minitest::Assertion: "User.count" didn't change by 1, but by 0. Expected: 4 Actual: 3

最初の部分 (「User.count」は 1 ずつ変化せず、0 だけ変化しました) は、データベース内のユーザー数が予想どおり 1 変化せず、同じままであることを意味します。

2 番目の部分 (予想: 4、実際: 3) は、POST リクエストの前にはデータベースに 3 人のユーザーが存在していましたが、その数が 1 増加することが予想されていたため、テストでは POST リクエスト後は 4 ユーザーになることが予想されたことを意味します。でも変わらなかったので3のままでした。

つまり、POST リクエストによって作成された新しいユーザーがなかったため、テストは失敗しました。ユーザーが作成されず、テストが失敗した理由をテストすることはできません。それはコントローラーとモデルの実装に依存するためです。

検証に失敗したため (パスワードの不足や電子メール アドレスの重複など)、ユーザーが保存されなかったために失敗したと思います。