MS伪造静态方法,返回具有私有构造函数的类

时间:2016-08-06 00:45:39

标签: c# .net unit-testing moq microsoft-fakes

我正在尝试假装/存根

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一起使用。是否有可能使用其中一个,或两者兼而有之?如果不是我的其他选择?

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

2 个答案:

答案 0 :(得分:1)

Domain没有c'tor所以你需要伪造将通过调用"GetComputerDomain()"创建的类的未来实例并修改“Name”的行为返回“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;
        }
    }

答案 1 :(得分:1)

如果您只想使用Fakes,这对我有用

    [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方法
  • 返回一个shimmed对象
  • 要查找Name属性,必须使用ActiveDirectoryPartition类,因为DomainActiveDirectoryPartition的子类,而且是定义它的位置。