2015-05-29 13 views
10

Tôi chỉ thấy rằng một loạt các bài kiểm tra đơn vị không thành công, do một nhà phát triển đã không chế nhạo sự phụ thuộc vào một khách hàng redis trong thử nghiệm. Tôi đang cố gắng đưa tay vào vấn đề này nhưng lại gặp khó khăn.Làm thế nào để giả lập một ứng dụng redis trong Python?

Phương pháp ghi vào một khách hàng redis:

redis_client = get_redis_client() 
redis_client.set('temp-facility-data', cPickle.dumps(df)) 

Sau đó trong khẳng định kết quả được lấy ra:

res = cPickle.loads(get_redis_client().get('temp-facility-data')) 
expected = pd.Series([set([1, 2, 3, 4, 5])], index=[1]) 
assert_series_equal(res.variation_pks, expected) 

tôi quản lý để vá get client redis của() và set() thành công .

@mock.patch('redis.StrictRedis.get') 
@mock.patch('redis.StrictRedis.set') 
def test_identical(self, mock_redis_set, mock_redis_get): 
    mock_redis_get.return_value = ??? 
    f2 = deepcopy(self.f) 
    f3 = deepcopy(self.f) 
    f2.pk = 2 
    f3.pk = 3 
    self.one_row(f2, f3) 

nhưng tôi không biết làm thế nào để thiết lập return_value của get() những gì set() sẽ thiết lập trong các mã, do đó kiểm tra sẽ vượt qua.

Ngay bây giờ dòng này không kiểm tra:

res = cPickle.loads(get_redis_client().get('temp-facility-data')) 
TypeError: must be string, not MagicMock 

Bất cứ lời khuyên được không?

+0

sử dụng 'side_effect' với một đối tượng chia sẻ là đặt trong tập hợp 'side_effect' và trả về' get_ side_effect'? https://docs.python.org/3/library/unittest.mock.html#quick-guide – user3012759

Trả lời

9

Hãy suy nghĩ bạn có thể sử dụng tác dụng phụ để thiết lập và nhận được giá trị trong một dict địa phương

data = {} 
def set(key, val): 
    data[key] = val 

def get(key): 
    return data[key] 

mock_redis_set.side_effect = set 
mock_redis_get.side_effect = get 

chưa được thử nghiệm này nhưng tôi nghĩ rằng nó nên làm những gì bạn muốn

+0

Nó hoạt động. Rất cám ơn +1 – Houman

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