AttributeError: can ' T set attribute
Arbeite ich auf einer älteren django-Projekt, gibt es irgendwo eine Klasse wie folgt definiert;
from django.http import HttpResponse
class Response(HttpResponse):
def __init__(self, template='', calling_context='' status=None):
self.template = template
self.calling_context = calling_context
HttpResponse.__init__(self, get_template(template).render(calling_context), status)
und diese Klasse wird verwendet, um Ansichten wie folgt
def some_view(request):
#do some stuff
return Response('some_template.html', RequestContext(request, {'some keys': 'some values'}))
diese Klasse wurde vor allem erstellt, so dass Sie könnte es verwenden, um führen Sie Behauptungen in den unit-tests .ich.e Sie sind nicht mit django.test.AUFTRAGGEBER zur Prüfung der Ansichten, sondern Sie erstellen ein mock-request und übergeben Sie, zu sehen, wie(aufrufen der Ansicht als callable) in die tests wie folgt
def test_for_some_view(self):
mock_request = create_a_mock_request()
#call the view, as a function
response = some_view(mock_request) #returns an instance of the response class above
self.assertEquals('some_template.html', response.template)
self.assertEquals({}, response.context)
Das problem ist, dass auf halbem Weg durch die test-suite(ein ziemlich großes test-suite), einige tests beginnen Sprengung, bei der Ausführung der
return Response('some_template.html', RequestContext(request, {'some keys': 'some values'}))
und der stack-trace ist
self.template = template
AttributeError: can't set attribute
den vollständigen stack-trace sieht so etwas wie
======================================================================
ERROR: test_should_list_all_users_for_that_specific_sales_office
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/austiine/Projects/mped/console/metrics/tests/unit/views/sales_office_views_test.py", line 106, in test_should_list_all_users_for_that_specific_sales_office
response = show(request, sales_office_id=sales_office.id)
File "/Users/austiine/Projects/mped/console/metrics/views/sales_office_views.py", line 63, in show
"sales_office_users": sales_office_users}))
File "/Users/austiine/Projects/mped/console/metrics/utils/response.py", line 9, in __init__
self.template = template
AttributeError: can't set attribute
den tatsächlichen fehlerhaften test ist
def test_should_list_all_users_for_that_specific_sales_office(self):
user_company = CompanyFactory.create()
request = self.mock_request(user_company)
#some other stuff
#calling the view
response = show(request, sales_office_id=sales_office.id)
self.assertIn(user, response.calling_context["sales_office_users"])
self.assertNotIn(user2, response.calling_context["sales_office_users"])
code für die anzeigen
def show(request, sales_office_id):
user = request.user
sales_office = []
sales_office_users = []
associated_market_names = []
try:
sales_office = SalesOffice.objects.get(id=sales_office_id)
sales_office_users = User.objects.filter(userprofile__sales_office=sales_office)
associated_market_names = Market.objects.filter(id__in= (sales_office.associated_markets.all())).values_list("name", flat=True)
if user.groups.all()[0].name == UserProfile.COMPANY_AO:
associated_market_names = [market.name for market in sales_office.get_sales_office_user_specific_markets(user)]
except:
pass
return Response("sales_office/show.html", RequestContext(request, {'keys': 'values'}))
der größte Teil der stack-trace ist nur ein Haufen von absoluten Pfaden für test-Datei, wo der code explodiert, die Ansicht und die eigentliche Datei, wo die exception stammt, dennoch werde ich hier einfügen
Versuchen Sie zu drucken Typ(Vorlage) vor sich selbst.template = Vorlage, und sagen Sie mir die print-info.
print type(Vorlage) gibt <type 'str'> und print type(self).Vorlage) zurück *** AttributeError: 'Antwort' - Objekt hat kein Attribut 'Vorlagen'
Es scheint mir, dass
self
im Antwort-haben eine nur-lese-Attribut mit dem Namen template
. Können Sie nach show()
Methode der sales_office_views.py
Modul?
InformationsquelleAutor austiine | 2014-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Antwort geht nicht auf die Einzelheiten dieser Frage, aber erklärt das zugrunde liegende Problem.
Diese Besondere Ausnahme "AttributeError: can ' T set attribute" ausgelöst wird (siehe Quelle), wenn das Attribut, das Sie versuchen zu ändern ist eigentlich eine Eigenschaft, der nicht über eine setter. Wenn Sie Zugang zu der Bibliothek von code, indem ein setter das problem zu lösen wäre.
EDIT: aktualisiert Quell-link auf den neuen Speicherort im code.
"Quelle" - link ist 404, aber in der momentanen code habe ich gefunden, Eigenschaften, hier als python oder als eigentliche C-code
Ist es möglich, eine Immobilie ohne einen setter?
sicher, das ist genau das Problem in der Frage. Eine Eigenschaft ist schreibgeschützt, es sei denn, ein setter ist explizit vorgesehen.
InformationsquelleAutor yoniLavi
Sieht es aus wie Sie nicht
self.template
imResponse
Klasse. Versuchen Sie es so:die gesamte Antwort Klasse ist für die Verwendung in tests
Also nach dem löschen von zwei Zeilen, da war immer noch der gleiche Fehler?
Nein, der Fehler geht Weg, aber meine tests schlagen fehl, weil Sie außer Antwort zu haben, Vorlage und calling_context Attribute
InformationsquelleAutor Stephen Lin
Nahm ich einen Blick zu django-source-code habe ich keine Ahnung, wo
template
odertemplates
Attribut kommt ausHttpResponse
. Aber ich kann vorschlagen, Sie ändern Ihre test-Ansatz und migrieren zu mock Rahmen. Schreiben Sie Ihr test-wie:@patch
decorator ersetzen Sie IhreResponse()
KlasseMagicMock()
und übergeben es an Ihre test-Methode alsmock_resp
variable. Sie können auchpatch
als Kontext-manager, indem Siewith
konstruieren, aber Dekorateure sind die cleaner Weg, es zu tun. Ich weiß nicht, obResponse
ist nur ein stub-Klasse zum testen, aber in diesem Fall können Sie den patch direktHttpResponce
, aber es hängt von deinem code.Finden Sie details über
call_args
hier. Vielleicht müssen Siespec
Attribut, weil django einige Typ-überprüfung... aber versuchen mit und ohne es (ich bin kein django-Experte). Erkundenmock
Rahmen: Geb es zu du viel der leistungsfähigen Werkzeuge für einfache tests.InformationsquelleAutor Michele d'Amico