Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MS伪造了使用私有构造函数返回类的静态方法_C#_.net_Unit Testing_Moq_Microsoft Fakes - Fatal编程技术网

C# MS伪造了使用私有构造函数返回类的静态方法

C# MS伪造了使用私有构造函数返回类的静态方法,c#,.net,unit-testing,moq,microsoft-fakes,C#,.net,Unit Testing,Moq,Microsoft Fakes,我在试着装假 System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name 我想知道如何分配GetComputerDomain以返回名为“TestDomain”的域。我可以返回空域,如下所示: System.DirectoryServices.ActiveDirectory.Fakes.ShimDomain .GetComputerDomain = () => { return null; };

我在试着装假

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"
        };
    };
我如何回避这个问题?我不认为这是可能的与最低起订量单独使用,我是用在一边的MS假货。有可能使用其中一个、另一个或两者来实现这一点吗?如果没有,我的其他选择是什么


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

没有c'tor,因此您需要伪造通过调用
“GetComputerDomain()”
创建的类的未来实例,并修改“Name”属性的行为以返回“TestDomain”。 这样做是可能的,而且非常容易,如以下示例所示:

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;
        }
    }
公共类单元测试
{
[测试方法,隔离]
public void GetDomainFakeName_willReturnFakeName()
{
var fakeDomain=Isolate.false.NextInstance();
隔离.WhenCalled(()=>System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()).WillReturn(fakeDomain);
当被调用时(()=>fakeDomain.Name).WillReturn(“TestDomain”);
var result=ClassUnderTest.SomeMethod();
AreEqual(“TestDomain”,result);
}
}
公共类未测试
{
公共静态字符串方法()
{
返回System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name;
}
}

没有c'tor,因此您需要伪造通过调用
“GetComputerDomain()”
创建的类的未来实例,并修改“Name”属性的行为以返回“TestDomain”。 这样做是可能的,而且非常容易,如以下示例所示:

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;
        }
    }
公共类单元测试
{
[测试方法,隔离]
public void GetDomainFakeName_willReturnFakeName()
{
var fakeDomain=Isolate.false.NextInstance();
隔离.WhenCalled(()=>System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()).WillReturn(fakeDomain);
当被调用时(()=>fakeDomain.Name).WillReturn(“TestDomain”);
var result=ClassUnderTest.SomeMethod();
AreEqual(“TestDomain”,result);
}
}
公共类未测试
{
公共静态字符串方法()
{
返回System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name;
}
}

如果你只是想用假货,这对我很有用

    [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
    的子类,而这正是定义它的地方

如果你只是想使用假货,这对我很有用

    [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
    的子类,而这正是定义它的地方

谢谢……以前从未使用过Typemock隔离器。我真的很喜欢它让你做Moq和假货不允许做的事情…或者很容易。您是严格使用Typemock隔离器,还是与Moq一起使用?我会接受其他人的回答,只是因为它只使用Moq和赝品,但我倾向于完全删除赝品,并使用它,因为只有VS专业版的开发人员不支持赝品…这在我看来有点蹩脚。谢谢…以前没有使用过Typemock隔离器。我真的很喜欢它让你做Moq和假货不允许做的事情…或者很容易。您是严格使用Typemock隔离器,还是与Moq一起使用?我会接受其他人的回答,只是因为它只使用最低起订量和假货,但我倾向于完全删除假货并使用它,因为只有VS专业版的开发人员不支持假货…这在我看来有点蹩脚。