2016-04-02 11 views
3

Ich verwende py.test zum Testen.tmpdir in py.test setup_class

In setup_class() ich verwenden müssen tmpdir für meine Klasse Konstruktor:

class TestMyClass: 
    def setup_class(self): 
     self.t = MyClass(path=tmpdir) 

    def test_test(self): 
     assert True 

Und ich habe einen Fehler:

NameError: name 'tmpdir' is not defined 

ich nicht setup_class(self, tmpdir) verwenden können.

Wenn ich diesen Code verwenden:

def test_needsfiles(tmpdir): 
    print(tmpdir) 
    assert 0 

Es ist Arbeit, aber ich brauche tmpdir in meiner Klasse Konstruktor.

Wie geht das?

Danke!

UPD

Ich versuche, dies zu tun:

@pytest.yield_fixture() 
def constructor(tmpdir): 
    _t = MyClass(path=str(tmpdir)) 
    yield _t 

class TestMyClass: 

    def test_test(self, constructor): 
     pass 

Aber ich kann nicht Tive in Befestigung verwenden:

ScopeMismatch: You tried to access the 'function' scoped fixture 'tmpdir' with a 'module' scoped request object, involved factories

Antwort

-2

Sie tempfile Modul verwenden können, zu handhaben mit temporären Dateien und Verzeichnissen. In Setup können Sie Temp-Verzeichnis mit mkdtemp erstellen und es bei tearDown von Testklasse löschen.

import shutil, tempfile 
import unittest 

class TestMyClass(unittest.TestCase): 
    def setUp(self): 
     self.tmp_dir = tempfile.mkdtemp() 

    def tearDown(self): 
     shutil.rmtree(self.tmp_dir) 
+0

thx, aber die Frage ist etwa ** py.test ** – tim

2

ich dies tun:

class TestMyClass: 
    @pytest.fixture(autouse=True) 
    def setup(self, tmpdir): 
     self.tmpdir = tmpdir.strpath 
0

Wenn Sie nicht wollen, @pytest.fixture(autouse=True) verwenden, wie @santon vorgeschlagen, aber Sie wollen eine Befestigung außerhalb TestMyClass schaffen (wie Sie in der UPD Teil schreiben) Sie dies versuchen:

@pytest.fixture 
def t(tmpdir): 
    return MyClass(tmpdir) 

class TestMyClass: 
    def test_test(self, t): 
     assert True 

Wenn Sie alles in einer Halterung zurück nicht wollen, sondern zum Beispiel in ein temporäres Verzeichnis gehen, können Sie auch tun:

@pytest.fixture 
def t(tmpdir): 
    os.chdir(str(tmpdir)) 

@pytest.mark.usefixtures("t")                
class TestMyClass: 
    def test_test(self): 
     assert True