2013-04-16 29 views
5

Tôi đang viết bài kiểm tra cho một ứng dụng Django và sử dụng một thuộc tính trên lớp thử nghiệm của tôi để ghi nhận những xem nó là nghĩa vụ phải được thử nghiệm, như thế này:Gọi chức năng bên ngoài mà không gửi 'tự' arg

# IN TESTS.PY 
class OrderTests(TestCase, ShopTest): 
    _VIEW = views.order 

    def test_gateway_answer(self): 
     url = 'whatever url' 
     request = self.request_factory(url, 'GET') 
     self._VIEW(request, **{'sku': order.sku}) 


# IN VIEWS.PY 
def order(request, sku) 
    ... 

My đoán là vấn đề tôi gặp phải là do vì tôi đang gọi thuộc tính của lớp OrderTests, python giả định tôi muốn gửi self và sau đó order nhận các đối số sai. Dễ dàng giải quyết ... chỉ không sử dụng nó như là một thuộc tính lớp, nhưng tôi đã tự hỏi nếu có một cách để nói với python không gửi tự trong trường hợp này.

Cảm ơn.

+0

Lưu ý rằng những gì bạn có ở đây là một phương thức thể hiện, không phải là một phương thức lớp. Đó là một sự khác biệt quan trọng, sự hiểu biết sẽ giúp bạn khắc phục vấn đề của mình. –

Trả lời

9

Điều này xảy ra vì trong hàm Python là descriptors, vì vậy khi chúng được truy cập trên các phiên bản lớp, chúng liên kết tham số đầu tiên (giả định self) của nó với cá thể.

Bạn có thể truy cập vào _VIEW trên lớp, không phải trên Ví dụ:

class OrderTests(TestCase, ShopTest): 
    _VIEW = views.order 

    def test_gateway_answer(self): 
     url = 'whatever url' 
     request = self.request_factory(url, 'GET') 
     OrderTests._VIEW(request, **{'sku': order.sku}) 

Ngoài ra, bạn có thể bọc nó trong staticmethod để ngăn chặn nó được liên kết với các trường hợp:

class OrderTests(TestCase, ShopTest): 
    _VIEW = staticmethod(views.order) 

    def test_gateway_answer(self): 
     url = 'whatever url' 
     request = self.request_factory(url, 'GET') 
     self._VIEW(request, **{'sku': order.sku}) 
+0

Tuyệt! Tôi biết về '@ staticmethod' nhưng không biết nó có thể được sử dụng như một chức năng (mà là ngu ngốc của tôi, bây giờ mà tôi nghĩ về nó, nhưng hey ...) Cảm ơn bạn rất nhiều! – Gabe

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