2011-01-18 21 views
5

Tôi có một lớp thông báo, có thể được khởi tạo bằng cách chuyển các đối số vào hàm tạo hoặc bằng cách không chuyển đối số và sau đó thiết lập các thuộc tính sau đó với các trình truy cập. Có một số tiền xử lý đang diễn ra trong các phương thức setter của các thuộc tính.Làm cách nào để xác nhận hành vi khởi tạo với RSpec?

Tôi đã có các thử nghiệm để đảm bảo các phương thức setter làm những gì chúng được cho là, nhưng tôi không thể tìm ra cách tốt để thử nghiệm phương thức khởi tạo thực sự gọi các bộ định cư.

class Message 
    attr_accessor :body 
    attr_accessor :recipients 
    attr_accessor :options 

    def initialize(message=nil, recipients=nil, options=nil) 
    self.body = message if message 
    self.recipients = recipients if recipients 
    self.options = options if options 
    end 

    def body=(body) 
    @body = body.strip_html 
    end 
    def recipients=(recipients) 
    @recipients = [] 
    [*recipients].each do |recipient| 
     self.add_recipient(recipient) 
    end 
    end 
end 
+0

có thể hướng dẫn ở đây: http://stackoverflow.com/questions/316294/rspec-how-to-stub-an-instance-method-called-by-constructor –

Trả lời

4

tôi sẽ có xu hướng để kiểm tra hành vi của các initializer,

nghĩa rằng thiết lập của nó các biến như thế nào bạn mong đợi.

Không bị cuốn vào thực tế về cách bạn thực hiện, giả sử rằng các trình truy cập cơ bản hoạt động, hoặc bạn có thể đặt các biến cá thể nếu bạn muốn. Nó gần như là một thử nghiệm đơn vị cũ thời tốt.

ví dụ:

describe "initialize" do 
    let(:body) { "some text" } 
    let(:people) { ["Mr Bob","Mr Man"] } 
    let(:my_options) { { :opts => "are here" } } 

    subject { Message.new body, people, my_options } 

    its(:message) { should == body } 
    its(:recipients) { should == people } 
    its(:options) { should == my_options } 
end 
+0

Tôi nghĩ rằng có lẽ mã ví dụ isn của tôi' t minh họa những gì tôi muốn làm, tôi sẽ chỉnh sửa nó để giải thích tốt hơn - vấn đề là các phương thức setter không chỉ lưu trữ giá trị. Tôi muốn có các xét nghiệm kiểm tra tất cả các trường hợp cạnh của các phương thức setter, và sau đó một thử nghiệm cho tôi biết rằng trình khởi tạo đang sử dụng chúng vì vậy tôi không phải lặp lại các trường hợp thử nghiệm. – Glenjamin

+0

Thực sự thử nghiệm của bạn là phương pháp riêng tư. Bạn chỉ nên làm phiền với "những gì xảy ra khi tôi tạo một thông điệp với những args" như trái ngược với "những gì được khởi tạo trên tin nhắn đang làm". Bằng cách đó, việc triển khai của bạn được mở để thay đổi, trong khi các bài kiểm tra có thể vẫn như cũ. –

Các vấn đề liên quan