2015-03-21 1 views
0

У меня есть APIView, который обращается к внешнему API самому, чтобы агрегировать результаты. Я определил его как таковой:Как издеваться над атрибутом на APIView для модульных тестов в django-rest-framework

class SampleView(APIView): 
    api = query_api() 

    def get(self, request, id): 
     result = self.api.query(id) 
     return HttpResponse(status=200) 

У меня есть высмеивал из API, чтобы сделать это проверяемым, не имея, что внешний API как зависимость в моих модульных тестов. Я хочу сделать что-то вроде SampleView.api = fake_api() перед запуском модульных тестов.

Как поменять один атрибут, подобный этому, чтобы заменить конкретный класс на издеваемую для модульного тестирования?

ответ

1

Я действительно не нашел существенного преимущества наличия объекта api в качестве атрибута класса. Это не относится к виду,

Вы можете ввести в действие object внутри получить запрос. Делая это, насмехается прямо.

In [21]: class ExternalApi(object): 
    def __init__(self, **kwargs): 
     print("APIService") 
    ....: 

In [22]: class MockedExternalApi(object): 
    def __init__(self, **kwargs): 
     print("FakeApiService") 
    ....: 

In [23]: def query_api(): 
    return ExternalApi() 
    ....: 

In [24]: class MyView(object): 
    def get(self, request): 
     api = ExternalApi(23) 
     return "Something" 
    ....: 

In [25]: @mock.patch('__main__.ExternalApi') 
def test(mocked_api): 
    mocked_api.return_value = MockedExternalApi() 

    view = MyView() 

    assert view.get({}) == "Something" 
    ....: 

In [26]: test() 
FakeApiService 

Также вы можете поиск settingsquery_api переменных внутри и возвращаете соответствующий объект в зависимости от сценария.