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