3 Stimmen

C#: Unit-Testing von Klassen einer Webanwendung

Ich arbeite an einer Webserver-Anwendung, die von Mobiltelefonen empfangene Anfragen verarbeitet. Ich habe Anfrageadapter, die Anfragen vom Telefon in Anfrageklassen anpassen, die ich im Rest der Anwendung verwende. Jeder Request-Adapter greift auf ein Objekt in einer Session zu und ändert eine seiner Eigenschaften. Nun die Frage: Ich möchte einen Unit-Test schreiben, der diesen Request-Adapter testet, aber ich habe keine Session, während ich den Test ausführe. Gibt es eine Möglichkeit, wie ich eine Session oder etwas Ähnliches erstellen kann, um den kompletten Adapter zu testen?

Vielen Dank im Voraus

5voto

Chris Marisic Punkte 31583

Was Sie tun möchten, ist die direkte Ersetzung durch eine Sitzung in Ihren Adaptern. Sie wollen eine Schnittstelle erstellen, etwa wie

public interface ISessionableObject
{
    MyData Data { get; set; }
}

und erstellen Sie dann 2 implementierende Klassen ähnlich wie

public class HttpSessionedObject : ISessionableObject
{
    public MyData Data {
        get { return Session["mydata"]; }
        set { Session["mydata"] = value; }
    }
}

public class DictionaryObject : ISessionableObject
{
    private readonly Dictionary<string, MyData> _dict = 
                                    new Dictionary<string, MyData>();

    public MyData Data {
        get { return dict ["mydata"]; }
        set { dict ["mydata"] = value; }
    }
}

Edita:

Nur für den Fall, dass Sie sich nicht sicher sind, was Sie damit anfangen sollen, bin ich sicher, dass Sie so etwas haben:

public class Adapter
{
    public void DoSomething()
    {
         var data = Session["mydata"];
        ...
    }
}

Stattdessen brauchen Sie etwas wie dieses

public class Adapter
{
    private readonly ISessionableObject _session;

    public Adapter(ISessionableObject session)
    {
        _session = session;
    }

    public void DoSomething()
    {
         var data = _session.Data;
        ...
    }
}

Ich würde empfehlen, ein Dependency Injection Framework wie StructureMap zu verwenden, um die Erstellung Ihrer Objekte zu handhaben, aber das ist ein viel größeres Thema, das nicht mit diesem Thema zusammenhängt, so dass zumindest mit armen Menschen Abhängigkeit Injektion gehen Ihr Code ähnlich sein wird

public class AdapterUser
{
    public void UsingPhone()
    {
        var adapter = Adapter(new HttpSessionedObject());
        ...
    }
}

Und

[UnitTest]
public class AdapterUserTest
{

    [Test]
    public void UsingPhone()
    {
        var adapter = Adapter(new DictionaryObject());
        ...
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X