2011-11-04 52 views
15

Tôi đã viết một phương thức lớp đơn giản Buy.get_days(string) và đang thử nghiệm nó với các đầu vào chuỗi văn bản khác nhau. Tuy nhiên tôi cảm thấy nó rất dài dòng.Cách kiểm tra các phương thức lớp trong RSPEC

  • Có cách nào ngắn gọn hơn để kiểm tra những điều sau không?
  • Có một số tương đương subject cho các phương thức mà tôi có thể tiếp tục chuyển các thông số khác nhau vào và kiểm tra kết quả không?
  • Có cách nào để tránh mô tả không cần thiết tại mỗi it không?

nhờ

describe Buy do 
    describe '.get_days' do 
    it 'should get days' do 
     Buy.get_days('Includes a 1-weeknight stay for up to 4 people') 
     .should == 1 
     end 
    it 'should get days' do 
     Buy.get_days('Includes a 1-night stay in a King Studio Room with stone fireplace') 
     .should == 1 
    end 
    it 'should get days' do 
     Buy.get_days('Includes 4 nights/5 days at the Finisterra Hotel for up to two adults and two children (staying in the same room)') 
     .should == 4 
    end 
    end 
end 
+4

Mô tả 'nó' không cần thiết như thế nào? Chỉ vì bạn đã viết cùng một văn bản cho các thông số kỹ thuật kiểm tra những thứ khác nhau không có nghĩa là mô tả không nên ở đó - có thể viết lại chúng để chúng hữu ích? –

+0

kết hợp đầu vào/đầu ra đủ mô tả (đối với tôi ít nhất). – lulalala

+0

bạn có thể đưa ra ví dụ về cách viết lại để làm cho nó hữu ích hơn không, @DaveNewton? – ahnbizcad

Trả lời

3

This là một điều thú vị mặc dù có lẽ có nhiều cách khác để sử dụng khối 'chủ đề' với các phương pháp Lớp.

Chỉnh sửa: Số tài khoản link bị hỏng theo báo cáo của Lưu trữ Wayback mà tôi cho là dễ bị cùng một vấn đề.

+1

[liên kết bị hỏng] (http://posterous.timocracy.com/a-pattern-for-testing-class-methods-in-ruby-w) cho biết "Không gian áp phích không còn khả dụng" –

+0

@JaredBeck được chỉnh sửa. Tôi sẽ tóm tắt câu trả lời tối nay. – TCopple

+0

Nội dung cũng có sẵn dưới dạng một ý chính: https://gist.github.com/timocratic/816049 – aingram

11

Không có một subject tương đương để gọi một phương pháp, vì vậy sử dụng it là con đường để đi đây. Vấn đề tôi thấy với mã của bạn như được trình bày là nó không thực sự giải thích những gì bạn đang thử nghiệm. Tôi sẽ viết một cái gì đó giống như:

describe Buy do 
    describe '.get_days' do 
    it 'should detect hyphenated weeknights' do 
     Buy.get_days('Includes a 1-weeknight stay for up to 4 people').should == 1 
    end 
    it 'should detect hyphenated nights' do 
     Buy.get_days('Includes a 1-night stay in a King Studio Room with stone fireplace').should == 1 
    end 
    it 'should detect first number' do 
     Buy.get_days('Includes 4 nights/5 days at the Finisterra Hotel for up to two adults and two children (staying in the same room)').should == 4 
    end 
    end 
end 

Tôi đang đưa ra giả định về những gì bạn đang ở đây, nhưng hy vọng ý tưởng là rõ ràng. Điều này cũng sẽ dẫn đến đầu ra lỗi hữu ích hơn nhiều khi thử nghiệm không thành công. Hi vọng điêu nay co ich!

+0

Tôi đoán câu trả lời cuối cùng là: không có cách nào ngắn gọn hơn để viết nó. – lulalala

+0

Vâng, sợ vậy. :) –

+0

@lulalala Bạn không * muốn * nó ngắn gọn, bạn muốn nó chính xác và mô tả trong bối cảnh của các thông số kỹ thuật. –

0

Một thay thế cho việc sử dụng subject/it là sử dụng before/specify:

describe '#destroy' do 
    context 'with children' do 
    before { @parent = FactoryGirl.create(:parent, children: FactoryGirl.create_list(:child, 2) } 
    specify { @parent.destroy.should be_false } 
    end 
end 

này sẽ tạo ra một mô tả hợp lý ở định dạng -fd đầu ra RSpec của:

#destroy 
    with children 
    should be false 
5

Đây có thể là một câu hỏi cũ nhưng bạn luôn có thể sử dụng subject.class để nhận được:

describe Buy do 
    describe '.get_days' do 
    it { expect(subject.class.get_days('Includes a 1-weeknight stay for up to 4 people')).to eq 1 } 
    end 
end 
+0

Chụp tốt ! facepalm. Tôi nên biết điều này. Đây là câu trả lời chính xác! – ahnbizcad

+1

'subject.class'? Nó sẽ không rõ ràng hơn để sử dụng 'Mua'? –

+0

@ahnbizcad Không thực sự, bởi vì điều này chỉ cho thấy một thử nghiệm duy nhất. Hãy suy nghĩ về đầu ra spec và những gì nó được cho là được hiển thị. Việc thêm các test khác không có test mô tả làm cho đầu ra spec vô dụng bởi vì bạn không biết (a) spec nào là test, và (b) những gì phân biệt các thông số khác nhau. –

7

Dường như có phương pháp described_class.

https://www.relishapp.com/rspec/rspec-core/docs/metadata/described-class

Tôi cho rằng nó sạch hơn subject.class, vì nó không giới thiệu một cuộc gọi . phương pháp, làm giảm khả năng đọc.

Sử dụng described_class hoặc subject.class có thể nhiều DRY hơn là đề cập đến lớp một cách rõ ràng trong mọi ví dụ. Nhưng cá nhân tôi nghĩ rằng không nhận được cú pháp làm nổi bật mà đi kèm với đề cập đến tên lớp một cách rõ ràng là loại một bummer, và tôi nghĩ rằng nó làm giảm khả năng đọc, mặc dù nó hoàn toàn chiến thắng trong bộ phận bảo trì.

Một câu hỏi đặt ra về thực hành tốt nhất:

bạn nên sử dụng bất cứ khi nào có thể described_class bên trong và bên ngoài các phương pháp .expect(), hoặc chỉ trong phương pháp expect()?

+0

Đây là những gì tôi thích sử dụng trong các thử nghiệm của tôi, để lại đối tượng cho dữ liệu được kiểm tra thông qua các phương pháp đã nêu. – DBrown

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