2016-08-06 6 views
0

ich zu fälschen bin versucht,/StubMS Fake Statische Methode, die Klasse Kosten mit eigenem Constructor

System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name 

Ich würde gerne wissen, wie GetComputerDomain zuweisen eine Domain mit dem Namen „Testdomäne“ zurückzukehren . Ich kann eine Null-Domäne zurück, wie folgt:

System.DirectoryServices.ActiveDirectory.Fakes.ShimDomain 
    .GetComputerDomain =() => { return null; }; 

Aber ich denke, das Hauptproblem ist, dass die Domain-Klasse nicht über einen öffentlichen Konstruktor, so kann ich nicht wie folgt vorgehen:

System.DirectoryServices.ActiveDirectory.Fakes.ShimDomain 
    .GetComputerDomain =() => 
    { 
     return new System.DirectoryServices.ActiveDirectory.Domain() 
     { 
      Name = "TestDomain" 
     }; 
    }; 

Wie Bekomme ich dieses Problem? Ich denke nicht, dass es mit Moq alleine möglich ist, was ich neben MS Fakes verwende. Ist es möglich, den einen, den anderen oder beides zu verwenden? Wenn nicht, was sind meine anderen Alternativen?

Seitennotiz: Ich bin nicht wirklich auf der Suche nach Alternativen zum Domain-Namen. Ich würde wirklich gerne mit meiner derzeitigen Implementierung daran arbeiten, da ich ein besseres Verständnis dafür haben möchte, wie man Dinge ausspioniert und vortäuscht, die in Zukunft in diese Kategorie fallen könnten. Alternativen sind willkommen, freuen sich aber sehr darauf, auf bestehende Fragen zu antworten.

Antwort

1

Wenn Sie nur Fakes verwenden möchten, ist dies für mich gearbeitet

[TestMethod] 
    public void TestDomain() 
    { 
     using (ShimsContext.Create()) 
     { 
      System.DirectoryServices.ActiveDirectory.Fakes.ShimDomain.GetComputerDomain =() => 
      { 
       return new System.DirectoryServices.ActiveDirectory.Fakes.ShimDomain(); 
      }; 

      System.DirectoryServices.ActiveDirectory.Fakes.ShimActiveDirectoryPartition.AllInstances.NameGet = 
       partition => 
       { 
        return "My Name"; 
       }; 

      string curName = System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name; 
      Assert.AreEqual("My Name", curName); 
     } 
    } 

Zwei Dinge zu beachten

  • Return ein Beilagpolstückes Objekt aus den statischen Get...Domain Methoden
  • das finden Name Eigenschaft, musste ActiveDirectoryPartition Klasse verwenden, da Domain ist eine Unterklasse von ActiveDirectoryPartition und das ist, wo es definiert ist.
1

Die Klasse Domain keine c'tor haben, so dass Sie zu fälschen die Zukunft Instanz der Klasse benötigen, die von "GetComputerDomain()" Aufruf erstellt werden und das Verhalten der „Name“ Eigenschaft ändern zurückzukehren „Testdomäne“. Es ist möglich, und recht einfach zu tun mit Typemock Isolator, wie im folgenden Beispiel gezeigt:

public class UnitTest 
    { 
     [TestMethod,Isolated] 
     public void GetDomainFakeName_willReturnFakeName() 
     { 
      var fakeDomain = Isolate.Fake.NextInstance<Domain>(); 
      Isolate.WhenCalled(() => System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()).WillReturn(fakeDomain); 
      Isolate.WhenCalled(() => fakeDomain.Name).WillReturn("TestDomain"); 

      var result = ClassUnderTest.SomeMethod(); 

      Assert.AreEqual("TestDomain", result); 
     } 
    } 

    public class ClassUnderTest 
    { 
     public static string SomeMethod() 
     { 
      return System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name; 
     } 
    } 
+0

Danke ... habe den Typemock Isolator noch nicht benutzt. Ich mag es, wie es Ihnen erlaubt, Dinge zu tun, die Moq und Fakes nicht zulassen ... oder einfach. Verwenden Sie streng Typemock Isolator oder soll es in Verbindung mit Moq verwendet werden? Ich werde akzeptieren, die anderen Jungs zu antworten, nur weil es nur Moq und Fakes verwendet, aber ich bin in Richtung Entfernen von Fakes vollständig und stattdessen verwenden, weil Fakes nicht für Entwickler, die nur VS Professional Version haben ... unterstützt ist meiner Meinung nach irgendwie lahm. –

Verwandte Themen