2012-05-08 29 views
14

Tôi có một lớp mô hình lưu trữ dữ liệu bằng redis. Lần đầu tiên tôi gọi một phương thức trên mô hình, nó tính giá trị JSON/Hash và lưu nó trong Redis. Trong những trường hợp nhất định tôi 'tuôn ra' dữ liệu đó và nó được tính toán lại trong lần gọi tiếp theo.Viết thử nghiệm với RSpec cho Redis với Rails

Dưới đây là đoạn mã tương tự như tôi sử dụng để lưu trữ các dữ liệu trong Redis:

def cache_data 
    self.data_values = data_to_cache 
    REDIS.set(redis_key,ActiveSupport::JSON.encode(self.data_values)) 
    REDIS.get(redis_key) 
end 

def data_to_cache 
    // generate a hash of values to return 
end 

Làm thế nào tôi nên đơn vị kiểm tra mã này? Tôi sử dụng RSpec và Capybara. Tôi cũng sử dụng Cucumber và Capabara để thử nghiệm tích hợp nếu điều đó có ích.

Trả lời

18

Tôi muốn chạy redis trong khi các thử nghiệm đang chạy. Redis, không giống như ví dụ: postgres, cực kỳ nhanh và không làm chậm thời gian chạy thử nghiệm đáng chú ý.

Chỉ cần đảm bảo bạn gọi REDIS.flush trong khối before(:each) hoặc móc dưa chuột tương ứng.

Bạn có thể kiểm tra data_to_cache độc lập với redis, nhưng trừ khi bạn hoàn toàn có thể tin tưởng trình điều khiển redis bạn đang sử dụng và hợp đồng cung cấp, an toàn hơn để thực sự kiểm tra cache_data (và phương pháp tìm nạp bộ nhớ cache tương ứng). Điều đó cũng cho phép bạn chuyển sang trình điều khiển redis khác (hoặc đến một cửa hàng KV nhanh khác) mà không cần phải bán lại các bài kiểm tra của bạn.

+11

Tôi tin rằng đây là bây giờ 'REDIS.flushdb' –

17

Trước hết thêm mã dưới đây trong spec_helper.rb vì vậy bạn sẽ chắc chắn rằng các bài kiểm tra sẽ chạy trên bất kỳ máy ngay cả khi máy chủ redis không được cài đặt:

redis_instance = MockRedis.new 
Redis.stubs(:new).returns(redis_instance) 
Redis::Store.stubs(:new).returns(redis_instance) 

Sau đó tôi sẽ kiểm tra:

  1. số liệu ghi vào REDIS là dữ liệu dự kiến ​​
  2. Một chuỗi cache_data, flush_data, cache_data gọi data_to_cache hai lần
+0

Vì vậy, bạn nên chạy redis và thực sự kiểm tra sự tương tác của dữ liệu với redis. Điều này đặt một sự phụ thuộc của việc chạy redis trong khi thử nghiệm đang được chạy (mà tôi không chống lại nói chung). Nhưng nó cho biết thêm một phụ thuộc mà tôi có thể thấy một số có thể khuyên bạn nên xử lý với cuống. –

+0

Không. Đó là MockRedis đang làm ... nó lưu trữ dữ liệu trong bộ nhớ, do đó bạn không cần một máy chủ redis. Tôi nói "vì vậy bạn sẽ chắc chắn rằng các bài kiểm tra sẽ chạy trên bất kỳ máy nào ngay cả khi máy chủ redis không được cài đặt". – bcd

+10

Một điều bạn có thể muốn thêm vào đầu câu trả lời này, rất hữu ích là: thêm 'gem 'mock_redis'' vào Gemfile của bạn và thêm dòng này vào spec_helper của bạn cũng' require' mock_redis'' –

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