【问题标题】:MS Fakes Static Method that Returns Class with Private ConstructorMS 伪造使用私有构造函数返回类的静态方法
【发布时间】:2016-08-06 00:45:39
【问题描述】:

我正在尝试伪造/存根

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

我想知道如何分配 GetComputerDomain 以返回名称为“TestDomain”的域。我可以返回一个空域,如下所示:

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

但我认为主要问题是 Domain 类没有公共构造函数,因此我无法执行以下操作:

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

如何解决这个问题?我认为单独使用 Moq 是不可能的,我在 MS Fakes 旁边使用它。是否可以使用一个、另一个或两者来完成此任务?如果不是,我的其他选择是什么?

旁注:我并不是真的在寻找获取域名的替代方法。我真的很想如何在我当前的实现中使用它,因为我想更好地理解如何模拟和伪造未来可能属于这一类的东西。欢迎使用替代方案,但非常期待回答现有问题。

【问题讨论】:

    标签: c# .net unit-testing moq microsoft-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 方法返回一个填充对象
    • 要查找 Name 属性,必须使用 ActiveDirectoryPartition 类,因为 Domain 是 ActiveDirectoryPartition 的子类,而这就是它的定义位置。

    【讨论】:

      【解决方案2】:

      Domain 类没有 c'tor,因此您需要伪造将通过调用 "GetComputerDomain()" 创建的类的未来实例,并修改“名称”属性的行为以返回 “测试域”。 使用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;
              }
          }
      

      【讨论】:

      • 谢谢...之前没有使用过 Typemock Isolator。我确实喜欢它如何让你做起订量和假货不允许的事情......或者轻松。您是严格使用 Typemock Isolator 还是要与 Moq 结合使用?我会接受其他人的回答,只是因为它只使用 Moq 和 Fakes,但我倾向于完全删除 Fakes 并改用它,因为只有 VS Professional 版本的开发人员不支持 Fakes ......这很好在我看来是蹩脚的。
      猜你喜欢
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2013-07-10
      相关资源
      最近更新 更多