2012-02-06 15 views
6

Konkretna klasa, którą testuję, zależy od obiektu HttpSessionState.Kłusowanie zamkniętych klas bez publicznych konstruktorów?

Klasa HttpSessionState nie zawiera publicznych konstruktorów. Testowana klasa używa tego obiektu tylko jako magazynu NameValue. Klasa jest używana w usłudze sieciowej ASMX do zwracania informacji o konkretnej metodzie.

Zastanawiam się nad utworzeniem elewacji wokół klasy HttpSessionState, w której mogę dostarczyć ciąg znaków Słownik <, ciąg > zamiast obiektu Session w testowaniu.

Czy to dobry pomysł lub standardowa praktyka?

Odpowiedz

8

Tak, jak mówi stare przysłowie, nie ma niczego, czego nie można by rozwiązać, dodając kolejną warstwę abstrakcji. Zwykle po prostu ukrywam ten typ za interfejsem, w którym metody interfejsu są jedynymi, które są potrzebne do wykonywania żądanych działań na tym typie.

tylko drwić interfejs, który ukrywa HttpSessionState, a nie twierdzi na zastosowań interfejsu, w Rhino Mocks to tylko AssertWasCalled (d => ....) itd

+3

"Nic nie da się rozwiązać, dodając kolejną warstwę abstrakcji" - z wyjątkiem "do wielu warstw abstrakcji" =) – Restuta

+0

Uważam, że oryginał brzmiał: "nie ma niczego, czego inny poziom pośrednictwa nie rozwiąże. " W pewnym momencie jednak nie będziesz w stanie przetestować poziomu, na przykład tego, co ukrywasz w httpsessionstate. Nie jesteś tego obeznany, ale zgadujesz, że tak naprawdę nie możesz go przetestować, ale możesz testować SUT, jeśli używasz wpisz tak, aby zrobić "coś". –

+0

Nie obchodzi mnie oryginał, to tylko prawda =) – Restuta

2

Można utworzyć podklasę klasy HttpSessionStateBase. This answer pokazuje, jak zaimplementować to dla Moq, ale nadal możesz używać klasy MockHttpSession ze swoimi Rhino Mocks (zakładam, nie użyłem Rhino Mocks).

public class MockHttpSession : HttpSessionStateBase 
{ 
    Dictionary<string, object> sessionStorage = new Dictionary<string, object>(); 

    public override object this[string name] 
    { 
     get { return sessionStorage[name]; } 
     set { sessionStorage[name] = value; } 
    } 
} 

Dość obszerna dyskusja na temat sposobu mock klas .NET można znaleźć na blogu Scotta Hanselman za here.

+0

jest klasa HttpSessionStateBase jest dostępna dla usług internetowych? –

+0

@PeterSmith HttpSessionStateBase znajduje się w przestrzeni nazw System.Web, jeśli o to ci chodzi. – jhsowter

2

Możesz kpić z każdego rodzaju, nawet zapieczętowanego, używając Microsoft's Moles Isolation framework for .NET. Wykonuje trochę pracy, ale może być lepszy niż dodanie kolejnej warstwy abstrakcji. Wyśmiewanie HttpContext i HttpSessionState przy użyciu moli jest omówione here. Istnieje jeszcze jedna podobna dyskusja here.

+1

Nie jestem pewien, czy uzyskać kolejną jedną zależność od projektu, czytać jako "zupełnie nowe ramy izolacji" jest prostsze rozwiązanie (czytaj jako lepsze), że jedna mała abstrakcja. – Restuta

+0

@Restuta, tak, prawdopodobnie masz rację, ale jest to opcja i odpowiada przynajmniej tytułem pytania "Kpiąc z zapieczętowanych klas" –

Powiązane problemy