2015-01-16 13 views

Odpowiedz

20
Podczas korzystania z #[test], nie ma nic szczególnego w metodach prywatnych lub publicznych - piszesz idealnie normalne funkcje, które mają dostęp do wszystkiego, do czego mają dostęp.

fn private_function() { 
} 

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

testy zewnętrzne, takie jak tests/*.rs i examples/*.rs jeśli korzystasz ładunku lub testy doc, nie uzyskać dostęp do członków prywatnych; nie powinni też: testy takie mają być publicznymi testami API, nie mając do czynienia ze szczegółami implementacji.

+0

Testy zewnętrzne powinny bezwzględnie mieć dostęp do części prywatnych, ponieważ: 1) Konieczne może być uzyskanie dostępu do części prywatnych w celu niezawodnego wyzwalania wszystkich ścieżek kodu za pośrednictwem publicznego interfejsu API. Na przykład może istnieć wewnętrzny próg, który po osiągnięciu wyzwala inną ścieżkę kodu. Do wyzwalania przypadków brzegowych może być również potrzebne wykonanie wstrzyknięcia awaryjnego lub wewnętrznych detali. 2) Dostęp do części prywatnych może zapewnić lepszą diagnostykę, gdy testy zakończą się niepowodzeniem - możesz wstawić wewnętrzne informacje do wiadomości paniki itp. – kralyk

+0

Diagnostyka: do tego służy 'std :: fmt :: Debug'. Co do reszty, stoję na stanowisku, że testy zewnętrzne nie powinny mieć dostępu do prywatnych danych. Testy zewnętrzne nie są odpowiednie dla sytuacji, którą opisujesz - do tego służą wewnętrzne testy jednostkowe. –

+0

'fmt :: Debug' jest zbyt gruboziarnisty w niektórych sytuacjach - na przykład, możesz nie chcieć drukować szczegółów o całej ogromnej strukturze danych, gdy jesteś tylko po określonym bitem. W każdym razie, czy w przypadku testu wewnętrznego można ustawić realistyczny przypadek użycia publicznego interfejsu API? Jeśli nie, to się nie uda, ponieważ muszę to zrobić. Jeśli tak, to w porządku, jestem szczęśliwy dla wszystkich i wewnętrznego testu, chociaż w tym momencie rozróżnienie jest bezsensowne? Głównym problemem jest to, że bez względu na to, jak bardzo się starasz, szczegóły implementacji zawsze wpływają na interfejs w jakiś sposób, nie ma możliwości obejścia tego. – kralyk

Powiązane problemy