2016-06-28 27 views
0

ich in der Regel verwenden:Warum 'Selbst' für Patch und Assertion in Python benötigt?

def create_patch(self, name, value = None): 
    patcher = patch(name) 
    mock = patcher.start() 
    mock.return_value = value 
    self.addCleanup(patcher.stop) 
    return mock 

def assertXmlEqual(self, a, b): 
    with open(a, 'r') as f: 
     axml = f.read() 
    with open(b, 'r') as f: 
     bxml = f.read() 
    self.assertEqual(loads(dumps((parse(axml)))), loads(dumps((parse(bxml))))) 

und in Testfälle:

mockobj = self.create_patch('mymodule.myclass.mymethod', 'myvalue') 

self.assertXmlEqual('expect.xml', 'result.xml') 

Aber für jede Unit-Test-Klasse, ich habe es zu kopieren.

Gibt es eine Möglichkeit diese mehr Testcase-unabhängig zu machen, eher wie ein lib, wie Moq und Assert in .net und mock und expect in Ruby?

Hier ist, wie sie sich verhalten. Sehen? Sie sind unabhängig von Testfällen.

Moq und Assert:

var obj = new Moq.Mock<MyPackage.MyClass>() { CallBase = true }; 
obj.Setup(p => p.MyMethod(Moq.It.IsAny<string>())).Returns(false); 

Assert.AreEqual(expect, result) 

allow und expect:

obj = double 
allow(obj).to receive(:my_method).and_return('myvalue') 

expect(result).to eq(expect) 
expect(obj).to have_received(:my_method).exactly(3).times 

Antwort

2

Sie eine Basistestfall erstellen können und dann alle Ihre anderen Testfälle erben von dass statt unittest.TestCase :

class MyBaseTestCase(unittest.TestCase): 
    def create_patch(self, name, value = None): 
     patcher = patch(name) 
     mock = patcher.start() 
     mock.return_value = value 
     self.addCleanup(patcher.stop) 
     return mock 

    def assertXmlEqual(self, a, b): 
     with open(a, 'r') as f: 
      axml = f.read() 
     with open(b, 'r') as f: 
      bxml = f.read() 
     self.assertEqual(loads(dumps((parse(axml)))), loads(dumps((parse(bxml))))) 


class MyTestCaseThatTestsSomething(MyBaseTestCase): 
    def test_something(self): 
     self.patch('something.dependency', 'Hello World') 
     result_xml = something() 
     self.assertXmlEqual(result_xml, expected_xml) 
+0

Guter Versuch mit Vererbung. Gibt es noch einen eleganteren Weg wie '' Moq''' und '' Assert''' in .net und '' 'mock''' und' '' erwarten''' in Ruby? – Mike

+0

@Mike - Soweit ich weiß, ist dies der Weg, dies mit Pythons "Unittest" zu erreichen. Ich weiß nicht, wie 'Moq' und' Assert' in .net funktionieren, noch weiß ich, wie 'mock' und' expect' in Ruby arbeiten. Was ist mit den zuvor genannten Frameworks, die sie "eleganter" machen? Welches Verhalten suchst du genau? Es ist möglich, dass es ein anderes Unit-Test-Framework für Python gibt, das näher an dem ist, wonach Sie suchen. – mgilson

+0

Ich habe mehr Details hinzugefügt :) – Mike