この記事について
付箋アプリっぽいページの作成過程で作ったモデルのテストコードをある程度記載しておくものです。
関連する記事
書いているうちに分量がすごくなって記事を分割したので、リンク先をまとめておきます。
その1(環境構築〜モデル作成編)
その2(API作成編)
その3(UI作成編1)
その4(UI作成編2)
おまけ(モデルのテスト編)
モデルができたら。。。テストでしょ?
Railsでアプリを作るうえで、最も大切なこと。
多分、テストの作成です。
自動化されたテストを作成しておかないと、後々痛い目に逢いました。(過去形。。)
ので、テスト内容を記載させていただきます。
Fixture
Fixtureはテストデータですね。
ユーザは3人(今回は未アサインタスクを保持させるためにnotassignedさんにも仲間に入ってもらいました。)分用意しました。
notassigned:
name: Not Assigned
alice:
name: Alice
bob:
name: Bob
タスクは2つほど用意しました。
関連付けがあるので、ユーザのfixtureで使った名前をそのまま使えます。(これすごい。)
task1:
title: Task001
description: Description 0001
due_date: 2020-05-01 10:03:32
user: notassigned
task2:
title: Task002
description: Description 0002
due_date: 2020-05-01 10:03:32
user: alice
テストの作成
タスクモデルのテスト
こちらは、以下の確認ができれば良いかな、とテストを作成しました。
・誰にもアサインされないタスクが作れないこと。
・誰かにアサインすればタスクが作れること。
・アサイン先を切り替えられること
## 以下のようなテストを追加しました。
# ユーザを指定しないタスクは保存できない。
test "Not assinged task should fail to create" do
new_task = Task.new(title: "test001", description: "hoge", due_date: Date.new(2020,5,1));
assert_raises(ActiveRecord::RecordInvalid) do
new_task.save!
end
end
# ユーザを指定すると保存できる。
test "Assinged task should success to create" do
user = users(:notassigned);
new_task = Task.new(title: "test001", description: "hoge", due_date: Date.new(2020,5,1), user: user);
assert_nothing_raised do
new_task.save!
end
end
# アサイン先を変更できる。
test "task's owner can be changed to another user" do
bob = users(:bob);
assert_difference('bob.tasks.count') do
target = tasks(:task2);
target.user = bob;
target.save!;
bob.tasks.reload;
end
end
ユーザモデルのテスト
こちらは以下について確認してみました。
・初期状態のユーザはタスクを持たない。(タスクを持たないユーザを作成できる)
・タスクの入れ替えができる。
test "New User should not have any tasks" do
user = User.new(name: "hoge hoge");
assert_nothing_raised do
user.save!;
end
assert_equal(0, user.tasks.count);
end
test "Task owner can be changed" do
bob = users(:bob);
notassigned = users(:notassigned);
notassigned_task = notassigned.tasks[0];
bob.tasks.push(notassigned_task);
assert_nothing_raised do
bob.save!;
notassigned.tasks.reload;
end
assert_equal(1, bob.tasks.length);
assert_equal(0, notassigned.tasks.length);
end