MS Fakes 静态方法 Returns Class with Private Constructor
MS Fakes Static Method that Returns Class with Private Constructor
我正在尝试 fake/stub 退出
System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name
我想知道如何将 GetComputerDomain 分配给 return 名称为 "TestDomain" 的域。我可以 return 一个空域,如下所示:
System.DirectoryServices.ActiveDirectory.Fakes.ShimDomain
.GetComputerDomain = () => { return null; };
但我认为主要问题是域 class 没有 public 构造函数,所以我无法执行以下操作:
System.DirectoryServices.ActiveDirectory.Fakes.ShimDomain
.GetComputerDomain = () =>
{
return new System.DirectoryServices.ActiveDirectory.Domain()
{
Name = "TestDomain"
};
};
如何解决这个问题?我不认为单独使用最小起订量是可能的,我正在与 MS Fakes 一起使用。是否可以使用一个、另一个或两者来实现这一目标?如果不是,我的其他选择是什么?
旁注:我并不是真的在寻找获取域名的替代方法。我真的很想知道如何在我当前的实现中使用它,因为我想更好地了解如何模拟和伪造将来可能属于此类的东西。欢迎使用替代方案,但真的很期待回答现有问题。
class Domain
没有 c'tor,因此您需要伪造 class 的未来实例,该实例将通过调用 "GetComputerDomain()"
并将 "Name" 属性 的行为修改为 return "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;
}
}
如果你只想使用假货,这对我有用
[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);
}
}
注意两点
- Return 来自静态
Get...Domain
方法的填充对象
- 要查找名称 属性,必须使用
ActiveDirectoryPartition
class,因为 Domain
是 ActiveDirectoryPartition
的子 class,并且是它被定义的地方。
我正在尝试 fake/stub 退出
System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name
我想知道如何将 GetComputerDomain 分配给 return 名称为 "TestDomain" 的域。我可以 return 一个空域,如下所示:
System.DirectoryServices.ActiveDirectory.Fakes.ShimDomain
.GetComputerDomain = () => { return null; };
但我认为主要问题是域 class 没有 public 构造函数,所以我无法执行以下操作:
System.DirectoryServices.ActiveDirectory.Fakes.ShimDomain
.GetComputerDomain = () =>
{
return new System.DirectoryServices.ActiveDirectory.Domain()
{
Name = "TestDomain"
};
};
如何解决这个问题?我不认为单独使用最小起订量是可能的,我正在与 MS Fakes 一起使用。是否可以使用一个、另一个或两者来实现这一目标?如果不是,我的其他选择是什么?
旁注:我并不是真的在寻找获取域名的替代方法。我真的很想知道如何在我当前的实现中使用它,因为我想更好地了解如何模拟和伪造将来可能属于此类的东西。欢迎使用替代方案,但真的很期待回答现有问题。
class Domain
没有 c'tor,因此您需要伪造 class 的未来实例,该实例将通过调用 "GetComputerDomain()"
并将 "Name" 属性 的行为修改为 return "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;
}
}
如果你只想使用假货,这对我有用
[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);
}
}
注意两点
- Return 来自静态
Get...Domain
方法的填充对象 - 要查找名称 属性,必须使用
ActiveDirectoryPartition
class,因为Domain
是ActiveDirectoryPartition
的子 class,并且是它被定义的地方。