Phương pháp bạn tìm thấy chắc chắn sẽ hoạt động để kiểm tra một chút chức năng nhưng có vẻ khá mỏng manh — lớp giả của bạn (thực ra chỉ là một Struct
giải pháp của bạn) có thể hoạt động như một lớp thực mà include
bạn quan tâm. Ngoài ra, nếu bạn đang cố gắng kiểm tra các mối quan tâm về mô hình, bạn sẽ không thể làm những việc như kiểm tra tính hợp lệ của các đối tượng hoặc gọi ra lệnh gọi lại ActiveRecord trừ khi bạn thiết lập cơ sở dữ liệu tương ứng (vì lớp giả của bạn sẽ không có bảng cơ sở dữ liệu sao lưu nó). Hơn nữa, bạn sẽ không chỉ muốn kiểm tra mối quan tâm mà còn muốn kiểm tra hành vi của mối quan tâm bên trong thông số kỹ thuật mô hình của bạn.
Vậy tại sao không giết hai con chim bằng một viên đá? Bằng cách sử dụng các nhóm ví dụ được chia sẻ của RSpec , bạn có thể kiểm tra mối quan tâm của mình đối với các lớp thực tế sử dụng chúng (ví dụ: mô hình) và bạn sẽ có thể kiểm tra chúng ở mọi nơi chúng được sử dụng. Và bạn chỉ phải viết các bài kiểm tra một lần và sau đó chỉ cần đưa chúng vào bất kỳ thông số kỹ thuật nào của mô hình mà bạn quan tâm. Trong trường hợp của bạn, nó có thể trông giống như sau:
# app/models/concerns/personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
# spec/concerns/personable_spec.rb
require 'spec_helper'
shared_examples_for "personable" do
let(:model) { described_class } # the class that includes the concern
it "has a full name" do
person = FactoryBot.build(model.to_s.underscore.to_sym, first_name: "Stewart", last_name: "Home")
expect(person.full_name).to eq("Stewart Home")
end
end
# spec/models/master_spec.rb
require 'spec_helper'
require Rails.root.join "spec/concerns/personable_spec.rb"
describe Master do
it_behaves_like "personable"
end
# spec/models/apprentice_spec.rb
require 'spec_helper'
describe Apprentice do
it_behaves_like "personable"
end
Ưu điểm của cách tiếp cận này thậm chí còn trở nên rõ ràng hơn khi bạn bắt đầu làm những việc mà mình quan tâm như gọi lệnh gọi lại AR, trong đó bất kỳ thứ gì nhỏ hơn đối tượng AR sẽ không làm được.