Статический метод MS 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 ответа

Решение

Если вы просто хотите использовать подделки, это работает для меня

    [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 и это где это определено.

Класс 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;
        }
    }
Другие вопросы по тегам