2017-01-26 4 views
1

definiert Ich habe diese Klasse:mit pytest parametrisieren Befestigung läuft Ich erhalte `self` nicht

accept.py

class AcceptC(object): 

    def __init__(self): 
     self.minimum = 30 
     self.maximum = 40 

und den Unittest:

accept_test.py

import unittest 
import pytest 

from app.accept import AcceptC 


class TestAcceptC(unittest.TestCase): 

    def setUp(self): 
     self.accept = AcceptC() 


@pytest.mark.parametrize(
    "minimum, maximum, expected_min, expected_max", [ 
     ("13", "5", 30, 40), 
     ("30", "40", 30, 40), 
    ]) 
def test_init_returns_correct_results(minimum, maximum, expected_min, expected_max): 
    expected_min = self.accept.minimum 
    expected_max = self.accept.maximum 
    self.assertEqual(minimum, expected_min) 
    self.assertEqual(maximum, expected_max) 


if __name__ == "__main__": 
    unittest.main() 

Beim Ausführen mit Pytest erhalte ich einen Fehler:

NameError: name 'self' is not defined

Ich sah auch, dass ich self in der Testfunktion nicht als Argument verwenden kann.

Schließlich ist es eine Möglichkeit, mit zu vermeiden:

expected_min = self.accept.minimum 
expected_max = self.accept.maximum 

und sofort self.accept.minimum benutzen?

Wenn ich self als Argument für die Testfunktion verwenden, gibt sie:

fixture 'self' not found

+1

'def test_init_returns_correct_results' ist nicht in irgendeiner Klasse, daher ist" self "nicht definiert – ZiTAL

+0

Es ist, weil selbst, wenn nicht definiert, wo Sie es verwenden. Das ist die ganze Antwort. Verwenden Sie nur Namen, die definiert sind. – Marcin

+0

@ZiTAL: Sie hatten Recht.Ich hatte die Einrückung verpasst.Aber noch habe ich Fehlermeldungen .. – George

Antwort

1

Sie sind die self in Ihre Methoden fehlt (vorausgesetzt, es ist eine Methode, wenn es eine Funktion ist, als Sie brauchen, um es ein Verfahren zur Herstellung TestAcceptC zuerst) Argumentliste:

def test_init_returns_correct_results(minimum, maximum, expected_min, expected_max): 

soll (er einige zusätzliche Änderungen tat, weg von unittest und mehr pytest -ähnlichen):

class TestAcceptC(): # no need to subclass unittest 

    @classmethod 
    def setup_class(cls): 
     # Called when setting up the class 
     cls.accept = AcceptC() 

    @pytest.mark.parametrize(
     ["minimum", "maximum", "expected_min", "expected_max"], [ 
      ("13", "5", 30, 40), 
      ("30", "40", 30, 40), 
     ]) 
    def test_init_returns_correct_results(self, minimum, maximum, expected_min, expected_max): 
     # difference is here -------------^^^^ 
     # pytest can use normal asserts here. 
     assert self.accept.minimum == expected_min 
     assert self.accept.maximum == expected_max 
+0

Wenn ich selbst als Argument verwenden, gibt es 'Fixture 'Selbst" nicht gefunden " – George

+0

Es ist eine Methode von Ihrem' TestAcceptC' Klasse, oder? Es sollte sein, wenn es auf sein Attribut zugreifen möchte. – MSeifert

+0

Ich teste die __init__ Methode der AcceptC Klasse. Und test_init .. ist eine Methode von TestAcceptC, .Es ist genau wie die 2 Dateien, die ich oben habe. – George