2009-12-08 5 views
5

Ich versuche Unit-Tests für meinen Linq To SQL-Code einzurichten. Mein Code verwendet die Klasse System.Data.Linq.Table (vom Designer generiert).Ist Typemock das einzige Framework, das eine Linq To SQL-Tabellenklasse vortäuschen kann?

Da diese Klasse versiegelt ist und der Konstruktor intern ist, ist sie vollständig impervious to unit testing frameworks like Rhino Mocks. (Es sei denn, Sie möchten Ihren Code ändern, um das Repository-Muster zu verwenden, was ich lieber nicht möchte.)

Typemock kann (wie auch immer) diese Klasse vortäuschen. (Siehe here für ein Beispiel.)

Typemock ist jedoch auch $ 800 eine Lizenz. Ich sehe nicht, dass mein Arbeitgeber in absehbarer Zeit dazu aufbricht.

Also hier ist die Frage. Gibt es noch andere spöttische Frameworks, die nicht auf Interfaces angewiesen sind, um die Mocks zu erstellen?


Edit: Beispiel für Code, den ich zu Test benötigen:

public class UserDAL : IUserDAL 
{ 
    private IDataClassesDataContext _ctx; 
    public UserDAL() 
    { 
     string env = ConfigurationManager.AppSettings["Environment"]; 
     string connectionString = ConfigurationManager 
            .ConnectionStrings[env].ConnectionString; 
     _ctx = new DataClassesDataContext(connectionString); 
    } 
    public UserDAL(IDataClassesDataContext context) 
    { 
     _ctx = context; 
    } 
    public List<User> GetUsersByOrganization(int organizationId) 
    { 
     IOrderedQueryable<User> vUsers = 
      (from myUsers in _ctx.Users 
      where myUsers.Organization == organizationId 
      orderby myUsers.LastName 
      select myUsers); 
     return vUsers.ToList(); 
    } 
    public bool IsUserInOrganization(User user, int orgainzationID) 
    { 
     // Do some Dal Related logic here. 

     return GetUsersByOrganization(orgainzationID).Contains(user);    
    } 
} 

Ich habe dies zu erleichtern, verkürzt sich die lesen. Die Idee ist, dass ich einige Code haben (wie IsUserInOrganization, die eine andere Methode aufruft (wie GetUsersByOrganization), die eine Linq Abfrage der Fall ist.

möchte ich Unit-Test die IsUserInOrganization Methode mögen. Sie tun, dass ich _ctx.Users verspotten müssten ., die eine Tabellenklasse wird (das ist versiegelt und verfügt über einen internen Konstruktor)

+0

Zwei Hinweise dazu Code: 1. Prüfung IsUserInOrganization in der Regel getrennt sein sollte von der Prüfung GetUsersByOrganization außer in Test Integration; sie machen nicht dasselbe. Tests von GetUsersByOrganization enthalten normalerweise die Abdeckung der spezifischen Verwendung in IsUserInOrganization. Ohne zusätzlichen Code in der IsUserInOrganization-Methode gibt es keinen Grund, die Methode zu testen, da GetUsersByOrganization die relevanten Fälle ohnehin testen sollte. Grundsätzlich, in diesem Fall wollen Sie meiner Meinung nach das falsche Ding testen. –

+0

Man ruft das andere an. Wie kann man es ausprobieren, ohne es auf eine andere Klasse zu übertragen? – Vaccano

+0

Sie können nicht. Das ist in der Tat ein Code-Geruch. –

Antwort

4

Check out Microsoft Stubs, die die einfache Prämisse hat:

jede .NET-Methode ersetzen mit Ihrem eigenen delegieren!

Und eine detailliertere Beschreibung seiner Fähigkeiten (Schwerpunkt ist meiner).

Stubs ein leichter Rahmen für Test Stubs und Umleitungen in NET ist, die vollständig auf Teilnehmer basierte, Typ sicher, refactorable und Quellcode erzeugt. Stubs wurde bieten ein minimaler Aufwand zum Pex weißen Box-Analyse entwickelt, um die Code Verträge Laufzeit Schriftsteller unterstützen und ermutigen, die programmatischen Modelle statt Aufzeichnung/Wiedergabe-Tests. Stubs können in jeder .NET-Methode verwendet werden, einschließlich nicht-virtueller/statischer Methoden in versiegelten Typen.

+0

Stubs wurde umbenannt in 'Moles' – Peli

+0

-1, von dem Versuch, Moles zu verwenden, um dies zu tun, ich habe es als sehr schwierig empfunden. Während in TypeMock ist dies: Mock mockDC = MockManager.Mock (typeof (CustomerServicesDataContext)); mockDC.ExpectGetAlways ("Kategorien", mockCats); --- 2 Zeilen Code (plus das MockCats-Objekt bauen)! – jcollum

+1

@jcollum, das ist ein ziemlich dünnes Argument für das Ablehnen einer Antwort, aber Sie tun, was Sie wollen. Nebenbei gesagt, ich habe nie gesagt, dass es einfacher ist als TypeMock und das beantwortet, was das OP gefragt hat. Wenn Sie eine TypeMock Lizenz haben, dann ist es gut für Sie ... benutzen Sie sie. Aber gehen Sie nicht davon aus, dass jeder einen hat. –

2

Es gibt zwei Standards Unit-Tests in diesem Fall nähern sich:

1) Setzen Sie die Plattform nicht testen - wenn die Abhängigkeit von a Framework-Klasse schreiben Sie keine Tests, bei denen diese Interaktion verifiziert wird. Dies bedeutet normalerweise, dass Sie eine Abhängigkeit zum Testzeitpunkt ersetzen, aber in Ihrem Fall bedeutet dies wahrscheinlich, dass Sie die Tabelle selbst injizieren.

2) Wickeln Sie die Plattform - wenn Sie etwas testen müssen, die mit der Plattform interagiert, dann schreiben Sie eine Wrapper-Schicht für die entsprechenden Komponenten

Es gibt auch die Integration und Akzeptanz zu prüfen, zu testen. In beiden Fällen akzeptieren Sie normalerweise die Abhängigkeit, die in Ihrer Anwendung vorhanden ist.

Um was genau geht es Ihnen beim Testen, dass Sie diese Klasse direkt nachahmen/ersetzen müssen?

Edit:

Es scheint, als ob Sie suchen Code zu vermeiden, Umschreiben mehr prüfbar zu sein. Dies ist der Punkt, an dem sich TypeMock auszeichnet, und das ist der Grund, warum einige Testanwälte denken, dass TypeMock zu Problemen führen kann. Es ist jedoch das richtige Werkzeug für den Job, wenn Sie sich absolut weigern, Ihren Code für die Testbarkeit neu zu strukturieren.

Edit # 2:

Vielleicht bin ich über diese allzu obsessiv, aber lassen Sie sich ein mehr prüfbar Muster betrachten:

Organization() 
{ 
    HasUser(name) 
} 

OrganizationDAL 
{ 
    Organization LoadOrganization(id) 
} 

OrganizationServiceFacade 
{ 
    IsUserInOrganization(name, orgid) 
    { 
     return OrgDAL.LoadOrganization(id).HasUser(name) 
    } 
} 

Organisation natürliches enthält Test für einen Benutzer nicht mehr Plattform sein muss -abhängig, sollten Sie in der Lage sein, die Datenquelle zu injizieren.OrganizationDAL ist nur dafür verantwortlich, Organisationen zu laden, anstatt Informationen über Organisationen zurückzugeben (obwohl es Möglichkeiten gibt, Abfragen in diese Ebene zu stellen, falls dies erforderlich ist). OrganizationServiceFacade ist nur dafür verantwortlich, komponierte Dienste bereitzustellen, die sowohl die Mockbarkeit erfüllen als auch die Notwendigkeit zusätzlicher Komponententests vermeiden (es ist ein Integration- oder möglicherweise sogar ein Akzeptanzziel), da es sich um eine Wrapperklasse handelt. Je nachdem, wie Sie Organisationen erstellen, können Sie Daten injizieren, ohne sich auf eine bestimmte Vorstellung davon zu verlassen, wie diese Daten funktionieren.

+0

Ich stimme für die Plattform zu wickeln. Sie sollten nicht dafür verantwortlich sein zu testen, dass Ihre Frameworks ordnungsgemäß funktionieren. –

+0

Ich habe mehr zu der Frage hinzugefügt, um zu zeigen, was mich beim Testen interessiert. – Vaccano

Verwandte Themen