testowanie typów internal

0

Mam następujący kod:

        public class SomeClass
        {
            internal SomeClass() { }

            // public methods and properties
        }

        public class SomeClassFactory
        {
            public SomeClass CreateSomeClassObject()
            {
                // some logic
                var so = new SomeClass();
                // some logic
                return so;
            }
        }

Obiekt klasy SomeClass może zostać stworzony jedynie przez obiekt klasy SomeClassFactory.
Metoda CreateSomeClassObject oprócz stworzenia obiektu klasy SomeClass wykonuje dodatkową logikę.

W związku z tym napisałem testy zarówno dla klasy SomeClass (korzystając z atrybutu InternalsVisibleTo) oraz dla klasy SomeClassFactory.

Teraz w metodach testowych klasy SomeClass widzę następujący kod:

var someClassObject = new SomeClass();

Pytanie:
Czy to nie jest mylący test? Zwłaszcza dla osób, które kiedyś spotkają się z tym kodem po raz pierwszy?
W końcu zabraniam tworzenia bezpośrednio obiektów klasy SomeClass. Można je stworzyć tylko przez fabrykę.
Mimo to, testy, które są również dokumentacją, pokazują jak tworzyć bezpośrednio taki obiekt (oczywiście w bibliotece testów jest to możliwe dzięki InternalsVisibleTo).

Czy powinienem robić testy dla klasy SomeClass?
Jeżeli zrobię testy dla tylko dla klasy SomeClassFactory to będę testował nie tylko funcjoonalność tej klasy, ale również klasy SomeClass. Czy to jest ok?

1

Dlaczego w ogóle chcesz testować internalowe klasy? Skoro na prawdę muszą być internalowe, to ich jedyną formą testu powinno być testowanie razem z klasą publiczną, która ich używa. A jeśli chcesz je testować oddzielnie, to uczyń je public.

0

Konkretna odpowiedź. Dzięki :)

0

Możesz skorzystać z dobrodziejstw biblioteki NSubstitute. Robisz to w ten sposób:

interface ISomeClassFactory 
{
   SomeClass CreateSomeClassObject();   
}

W teście:

var factory = Substitute.For<ISomeClassFactory>();
factory.CreateSomeClassObject().Returns(new SomeClass());

Nie jest to najelegantsze rozwiązanie, ale przynajmniej udajesz tutaj, że korzystasz z factory ;)

PS. Rzecz jasna potrzebna tu jest przyjaźń międzydllkowa ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1