2011-11-25 24 views
15

Tôi có lớp sau: Tôi muốn đảm bảo url lớp chỉ được đặt một lần cho tất cả các phiên bản.Làm cách nào để xóa biến lớp giữa các thử nghiệm rspec trong ruby ​​

class DataFactory 
    @@url = nil 

    def initialize() 
begin 
    if @@url.nil? 
     Rails.logger.debug "Setting url" 
     @@url = MY_CONFIG["my value"] 
    end 
rescue Exception 
    raise DataFactoryError, "Error!" 
end 
    end 
end 

Tôi có hai bài kiểm tra:

it "should log a message" do 
    APP_CONFIG = {"my value" => "test"} 
    Rails.stub(:logger).and_return(logger_mock) 
    logger_mock.should_receive(:debug).with "Setting url" 

    t = DataFactory.new 
    t = nil 
end 

it "should throw an exception" do 
    APP_CONFIG = nil 

    expect { 
    DataFactory.new 
    }.to raise_error(DataFactoryError, /Error!/) 
end 

Vấn đề là thử nghiệm thứ hai không bao giờ ném một ngoại lệ là @@ biến lớp url vẫn thiết lập từ các thử nghiệm đầu tiên khi chạy thử nghiệm thứ hai. Mặc dù tôi đã nhận được cá thể không đến lúc kết thúc bộ sưu tập rác thử nghiệm đầu tiên chưa xóa bộ nhớ trước khi thử nghiệm thứ hai chạy:

Bất kỳ ý tưởng nào cũng tuyệt vời! Tôi đã nghe bạn có thể có thể sử dụng Class.new nhưng tôi không chắc chắn làm thế nào để đi về điều này.

+0

Không chính xác liên quan đến vấn đề của bạn, nhưng: * không bao giờ * sử dụng biến @@ class trong Ruby. Sử dụng các biến mẫu @class thay thế. Họ cư xử nhiều hơn dự đoán. –

Trả lời

19
describe DataFactory 
    before(:each) { DataFactory.class_variable_set :@@url, nil } 
    ... 
end 
+1

Khi tôi chạy này, tôi đã nhận lỗi sau: ** NameError: biến lớp uninitialized @@ url trong Object ** tôi đã nhận nó làm việc sử dụng: 'trước (: mỗi) làm DataFactory.class_eval {class_variable_set: @@ url, nil} end' _Tôi đang sử dụng JRuby 1.6.5 mà tôi tin rằng sử dụng Ruby 1.8.9 và class_variable_set có thể là riêng tư trong phiên bản này vì vậy tôi phải sử dụng class_eval_ Xem: [http: //www.khelll .com/blog/ruby ​​/ ruby-reflection-2 /] –

3

Đây là giải pháp thay thế cho câu trả lời được chấp nhận, trong khi không giải quyết được ví dụ cụ thể của bạn, tôi hy vọng nó có thể giúp một vài người có câu hỏi trong cùng một mạch. Nếu lớp trong câu hỏi không chỉ định một giá trị mặc định, và vẫn không xác định cho đến khi thiết lập, điều này dường như làm việc:

describe DataFactory 
    before(:each) do 
    DataFactory.remove_class_variable :@@url if DataFactory.class_variable_defined? :@@url 
    end 
    ... 
end 

trình cho tôi với một lớp học với một cái gì đó giống như:

def initialize 
    @@url ||= MY_CONFIG["my value"] 
    ... 
end 
Các vấn đề liên quan