2017-10-03 2 views
1

Titel sagt alles. Ich werde die Frage veranschaulichen, indem ich zeige, was ich versuche zu tun.Gibt es eine Möglichkeit, ein Scheinmodell in Django-Komponententests zu deklarieren?

Ich habe Djangos erweitert ModelForm Klasse eine ResourceForm, zu schaffen, die einige Funktionen in seine clean() Methode für die Arbeit mit Resources, deren Einzelheiten sind unwichtig gebaut hat. Die ist im Grunde eine Bibliotheksklasse und es gibt keine Modelle in der App, in denen die ResourceForm Klasse definiert ist, so dass ich nicht einfach ein vorhandenes Modell aus der App verwenden kann (z. B. mock.Mock(spec=SomeModel) ist keine Option).

Ich versuche, Unit-Test ResourceForm, aber ich kann nicht den richtigen Weg finden, um eine Django Model, zu verspotten, die seit ResourceForm erbt von ModelForm erforderlich ist. Dies ist eine von mehreren Anstrengungen, die ich versucht habe (nicht mock in diesem Fall verwendet wird, aber es dient zur Veranschaulichung, was versucht wird):

class ResourceFormTestCase(TestCase): 

    class SampleModel(Model): 
     sample_field = CharField() 

    class SampleResourceForm(ResourceForm): 
     class Meta(): 
      model = SampleModel 
      fields = ['sample_field'] 

    def test_unsupported_field_raise_validation_error(self): 
     print('Test validation error is raised when unsupported field is provided') 
     form_data = {'sample_field': 'FooBar', 'unsupported_field': 'Baz'} 
     form = self.SampleResourceForm(data=form_data) 

Aber das wirft:

RuntimeError: Model class customer.tests.tests_lib_restless_ext.SampleModel doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS. 

Ich bin offen zu Vorschlägen, wenn ich in der Art bin, wie ich versuche, das zu testen.

Antwort

0

Die einfachste Sache, die funktionieren könnte, ist die user model, die mit Django kommt.

Wenn das nicht akzeptabel ist, habe ich erfolgreich genug von der Django-Installation gepatcht, um es zum Schweigen zu bringen und Komponententests ohne eine Datenbankverbindung auszuführen. Schauen Sie im django_mock_queries project nach, ob irgendetwas davon hilfreich ist.

Verwandte Themen