2014-04-12 15 views
8

Tôi đang cố gắng kiểm tra logic chạy trong quá trình thừa kế lớp, nhưng đã chạy vào một vấn đề khi chạy nhiều xác nhận.làm thế nào để kiểm tra thừa kế ruby ​​với rspec

tôi lần đầu tiên cố gắng ...

describe 'self.inherited' do 
    before do 
    class Foo 
     def self.inherited klass; end 
    end 

    Foo.stub(:inherited) 

    class Bar < Foo; end 
    end 

    it 'should call self.inherited' do 
    # this fails if it doesn't run first 
    expect(Foo).to have_received(:inherited).with Bar 
    end 

    it 'should do something else' do 
    expect(true).to eq true 
    end 
end 

nhưng điều này không thành công vì lớp Bar đã được nạp, và do đó không gọi inherited một lần thứ 2. Nếu xác nhận không chạy trước ... nó không thành công.

Vì vậy, sau đó tôi đã cố gắng một cái gì đó giống như ...

describe 'self.inherited once' do 
    before do 
    class Foo 
     def self.inherited klass; end 
    end 

    Foo.stub(:inherited) 

    class Bar < Foo; end 
    end 

    it 'should call self.inherited' do 
    @tested ||= false 
    unless @tested 
     expect(Foo).to have_receive(:inherited).with Bar 
     @tested = true 
    end 
    end 

    it 'should do something else' do 
    expect(true).to eq true 
    end 
end 

@tested không tồn tại từ thử nghiệm để kiểm tra, thử nghiệm không chỉ chạy một lần.

có ai có cách thông minh để thực hiện việc này không? Đây là một ví dụ contrived và tôi không thực cần phải kiểm tra ruby ​​bản thân;)

+0

Kiểm tra các hành vi, không thực hiện. Kiểm tra nếu lớp kế thừa từ lớp đến sẽ chỉ hợp lý nếu phương thức đang làm công cụ lập trình meta (như lớp xây dựng và đặt anccestors) –

Trả lời

24

Dưới đây là một cách dễ dàng để kiểm tra cho lớp kế thừa với RSpec:

với

class A < B; end 

một cách đơn giản hơn nhiều để kiểm tra thừa kế với RSpec:

describe A 
    it { expect(described_class).to be < B } 
end 
+1

Câu trả lời hay! Có thể tìm thấy giải thích tại đây: http://ruby-doc.org/core-2.3.0/Module.html#method-i-3C –

0

Hãy định nghĩa lớp học của bạn để thử nghiệm thừa kế chạy trong khi thử nghiệm:

describe 'self.inherited' do 

    before do 
    class Foo 
     def self.inherited klass; end 
    end 
    # For testing other properties of subclasses 
    class Baz < Foo; end 
    end 

    it 'should call self.inherited' do 
    Foo.stub(:inherited) 
    class Bar < Foo; end 
    expect(Foo).to have_received(:inherited).with Bar 
    end 

    it 'should do something else' do 
    expect(true).to eq true 
    end 
end 
+0

đơn giản ... chỉ cần sử dụng một lớp khác cho bài kiểm tra đơn đó ... tất nhiên! cảm ơn! – brewster

1

Vì một lý do nào đó, tôi không quản lý solution from David Posey để hoạt động (Tôi đoán mình đã làm điều gì đó sai. Cảm thấy tự do để cung cấp một giải pháp trong các ý kiến). Trong trường hợp ai đó ngoài kia có cùng một vấn đề, công trình này quá:

describe A 
    it { expect(described_class.superclass).to be B } 
end 
1

Đối với một cái gì đó như thế này

class Child < Parent; end 

tôi thường làm:

it 'should inherit behavior from Parent' do 
    expect(Child.superclass).to eq(Parent) 
end 
Các vấn đề liên quan