2015-01-16 12 views

Antwort

20

Wenn Sie #[test] verwenden, gibt es nichts Besonderes an privaten oder öffentlichen Methoden - Sie schreiben nur ganz normale Funktionen, die auf alles zugreifen können, auf das sie zugreifen können.

fn private_function() { 
} 

#[test] 
fn test_private_function() { 
    private_function() 
} 

Externe Tests, wie tests/*.rs und examples/*.rs, wenn Sie Fracht verwenden, oder doc-Tests, erhalten keinen Zugriff auf private Mitglieder; noch sollten sie: solche Tests sind als öffentliche API-Tests konzipiert, die sich nicht mit Implementierungsdetails befassen.

+0

Externe Tests sollten unbedingt den Zugriff auf private Teile erlauben, weil 1) Sie möglicherweise Zugriff auf private Teile benötigen, um alle Code-Pfade über die öffentliche API zuverlässig auszulösen. Zum Beispiel könnte es einen internen Schwellenwert geben, der bei Erreichen einen anderen Codepfad auslöst. Sie müssen möglicherweise auch eine Fehlerinjektion oder interne Details zum Auslösen von Kantenfällen verwenden. 2) Der Zugriff auf private Teile kann eine bessere Diagnose liefern, wenn Tests fehlschlagen - Sie können interne Informationen in eine Panic-Nachricht einfügen usw. – kralyk

+0

Diagnose: Das ist, was 'std :: fmt :: Debug 'ist. Im Übrigen stehe ich zu meiner Position, dass externe Tests keinen Zugang zu privaten Details haben sollten. Externe Tests sind für die von Ihnen beschriebene Situation nicht geeignet - dafür gibt es interne Komponententests. –

+0

'fmt :: Debug 'ist in einigen Situationen zu grobkörnig - zum Beispiel möchten Sie vielleicht keine Details über eine ganze riesige Datenstruktur drucken, wenn Sie nur nach einem bestimmten Bit sind. Ist es für interne Tests angemessen, auch einen realistischen Anwendungsfall der öffentlichen API einzurichten? Wenn nicht, wird das nicht funktionieren, da ich genau das tun muss. Wenn ja, dann bin ich zufrieden mit all dem und dem internen Test, obwohl die Unterscheidung zu diesem Zeitpunkt irgendwie pointless ist? Das Kernproblem ist, dass die Implementierungsdetails unabhängig davon, wie sehr Sie es versuchen, die Schnittstelle immer irgendwie beeinflussen, da ist kein Weg vorbei. – kralyk