2016-08-06 24 views
0

我試圖假冒/存根出MS假貨的靜態方法返回Class與私有構造

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

我想知道如何分配GetComputerDomain與「TESTDOMAIN」的名稱返回域。我可以返回一個空域如下:

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

但我認爲主要的問題是,域類沒有公共構造函數,所以我不能做到以下幾點:

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

如何我能解決這個問題嗎?我並不認爲只有Moq可以和MS Fakes一起使用。是否有可能使用其中一種,另一種或兩種來實現這一目標?如果不是,我的其他選擇是什麼?

附註:我沒有真正尋找獲取域名的替代方案。我真的很想在當前的實施中如何使用它,因爲我希望更好地瞭解如何在將來可能屬於這一類別的情況下進行模擬和僞造。歡迎替代品,但真的很期待回答現有問題。

回答

1

如果你只是想用假貨,這個工作對我來說

[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); 
     } 
    } 

需要注意兩點

  • 返回從靜態Get...Domain方法勻對象
  • 爲了找到名稱屬性,必須使用ActiveDirectoryPartition類,因爲DomainActiveDirectoryPartition的子類,並且這是它的定義。
1

Domain沒有c'tor所以你需要假將要創建的類的實例未來通過調用"GetComputerDomain()"和修改「名稱」屬性的行爲,返回「TESTDOMAIN」。 這是可能的,並且很容易與Typemock Isolator這樣做,如下面的例子:

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

謝謝......之前沒有使用過Typemock Isolator。我喜歡它如何讓你做Moq和Fakes不允許的或不容易的事情。你是否嚴格使用Typemock Isolator或是否與Moq一起使用? 我打算接受其他人的答案只是因爲它只使用Moq和Fakes,但我傾向於完全移除Fakes並使用它,因爲Fakes不支持只有VS Professional版本的開發人員......在我看來是有點蹩腳。 –