Ответ 1
Первая попытка
В соответствии с документами Minitest
я попробовал < Minitest::Test
, но получил gems/minitest-4.7.5/lib/minitest/unit.rb:19:in 'const_missing': uninitialized constant MiniTest::Test (NameError)
, что привело меня к выводу, что документы в master для Minitest 5. Поэтому я преследовал документы Minitest перед фиксацией версии 5 и обнаружил, что мы должны быть подклассифицированы MiniTest::Unit::TestCase
.
тест/политика/book_policy_test.rb
require 'test_helper'
class BookPolicyTest < Minitest::Test
...
end
Вторая попытка (правильный суперкласс)
тест/политика/book_policy_test.rb
require 'test_helper'
class BookPolicyTest < Minitest::Unit::TestCase
def test_new
user = FactoryGirl.create(:user)
book_policy = BookPolicy.new(user, Book.new)
assert book_policy.new?
end
def test_create
book = FactoryGirl.create(:book)
book_policy = BookPolicy.new(book.user, book)
assert !book_policy.create?
end
end
Рефакторинг один (создайте метод "разрешение" )
тест/политика/book_policy_test.rb
require 'test_helper'
class BookPolicyTest < Minitest::Unit::TestCase
def test_new
user = FactoryGirl.create(:user)
assert permit(user, Book.new, :new)
end
def test_create
book = FactoryGirl.create(:book)
assert !permit(book.user, book, :create)
end
private
def permit(current_user, record, action)
self.class.to_s.gsub(/Test/, '').constantize.new(current_user, record).public_send("#{action.to_s}?")
end
end
Refactor two (создать класс PolicyTest)
Тест /test _helper.rb
class PolicyTest < Minitest::Unit::TestCase
def permit(current_user, record, action)
self.class.to_s.gsub(/Test/, '').constantize.new(current_user, record).public_send("#{action.to_s}?")
end
end
тест/политика/book_policy_test.rb
require 'test_helper'
class BookPolicyTest < PolicyTest
def test_new
user = FactoryGirl.create(:user)
assert permit(user, Book.new, :new)
end
def test_create
book = FactoryGirl.create(:book)
assert !permit(book.user, book, :create)
end
end
Рефактор три (создайте метод "запретить" )
Тест /test _helper.rb
class PolicyTest < Minitest::Unit::TestCase
def permit(current_user, record, action)
self.class.to_s.gsub(/Test/, '').constantize.new(current_user, record).public_send("#{action.to_s}?")
end
def forbid(current_user, record, action)
!permit(current_user, record, action)
end
end
тест/политика/book_policy_test.rb
require 'test_helper'
class BookPolicyTest < PolicyTest
def test_new
user = FactoryGirl.create(:user)
assert permit(user, Book.new, :new)
end
def test_create
book = FactoryGirl.create(:book)
assert forbid(book.user, book, :create)
end
end
Добавить полный набор тестов политики
require 'test_helper'
class BookPolicyTest < PolicyTest
def test_new
assert permit(User.new, Book.new, :new)
book = FactoryGirl.create(:book)
assert forbid(book.user, book, :new)
end
def test_create
assert permit(User.new, Book.new, :create)
book = FactoryGirl.create(:book)
assert forbid(book.user, book, :create)
end
def test_show
# a stranger should be able to see a published book
stranger = FactoryGirl.build(:user)
book = FactoryGirl.create(:book, published: true)
refute_equal stranger, book.user
assert permit(stranger, book, :show)
# but not if it NOT published
book.published = false
assert forbid(stranger, book, :show)
# but the book owner still should
assert permit(book.user, book, :show)
# and so should the admin
admin = FactoryGirl.build(:admin)
assert permit(admin, book, :show)
end
end