2012-12-28 2 views
6

Tôi đang thử nghiệm một biến cá thể cấp lớp (và định vị) trong một đá quý bằng cách sử dụng RSpec. Tôi cần phải kiểm tra những điều sau đây:Kiểm tra biến lớp RSpec

  1. Giá trị mặc định chính xác được cung cấp nếu setter không bao giờ được sử dụng.
  2. Biến có thể được cập nhật thành công thông qua trình cài đặt.

Rõ ràng là có sự cố đơn đặt hàng tại đây. Nếu tôi thay đổi các giá trị bằng cách sử dụng các setters, tôi mất bộ nhớ của giá trị mặc định là gì. Tôi có thể lưu nó vào một biến trước khi kiểm tra setter và sau đó thiết lập lại giá trị ở cuối, nhưng điều đó chỉ bảo vệ tôi nếu tất cả các thử nghiệm setter theo cùng một thực hành.

Cách tốt nhất để kiểm tra giá trị mặc định của biến là gì?

Dưới đây là một ví dụ đơn giản:

class Foo 
    class << self 
    attr_accessor :items 
    end 
    @items = %w(foo bar baz) # Set the default 
    ... 
end 

describe Foo do 

    it "should have a default" do 
    Foo.items.should eq(%w(foo bar baz)) 
    end 

    it "should allow items to be added" do 
    Foo.items << "kittens" 
    Foo.items.include?("kittens").should eq(true) 
    end 
end 
+0

ohh, Vì vậy, bạn có nghĩa là một cái gì đó như 'Foo.bar = 1'? –

+0

Có, mã được cập nhật với một ví dụ. –

Trả lời

8
class Foo 

    DEFAULT_ITEMS = %w(foo bar baz) 
    class << self 
    attr_accessor :items 
    end 
    @items = DEFAULT_ITEMS 

end 

describe Foo do 
    before(:each) { Foo.class_variable_set :@items, Foo::DFAULT_ITEMS } 

    it "should have a default" do 
    Foo.items.should eq(Foo::DEFAULT_ITEMS) 
    end 

    it "should allow items to be added" do 
    Foo.items << "kittens" 
    Foo.items.include?("kittens").should eq(true) 
    end 
end 

Hoặc có thể là một cách tốt hơn là để tải lại lớp

describe 'items' do 
    before(:each) do 
    Object.send(:remove_const, 'Foo') 
    load 'foo.rb' 
    end 

end 
+0

Đó là @variable ở cấp lớp. Nếu tôi sử dụng 'before (: each)', mặc định có thể được thay đổi trong mã và các kiểm tra sẽ không nhận thấy. –

+0

đã chỉnh sửa câu trả lời của tôi –

+0

Giải pháp tốt. Tôi đã xem xét đường hầm khi thực hiện công việc thử nghiệm cho mã thay vì làm cho mã của tôi dễ kiểm tra hơn. Cảm ơn bạn đã di chuyển trở lại đúng hướng! :) –

6

Nếu lớp học của bạn có trạng thái nội mà bạn muốn thử nghiệm tôi thấy rằng sử dụng class_variable_get một cách tốt đẹp để tiếp cận điều này. Điều này không yêu cầu bạn để lộ bất kỳ của các biến trong lớp, vì vậy lớp học có thể ở lại bị ảnh hưởng.

Tôi biết đây không phải là những gì bạn yêu cầu trong câu hỏi của bạn, nhưng nó nằm trong tiêu đề, điều đã đưa tôi đến đây.

+0

Cảm ơn bạn đã bổ sung. Bạn có quyền rằng điều này là một chút khác nhau, nhưng hy vọng rằng sẽ giúp những người khác tìm thấy bài đăng này và đang tìm kiếm một cái gì đó một chút khác với những gì tôi đã được giải quyết. –

+0

Chính xác những gì tôi đang tìm kiếm: D cảm ơn – gdurelle