如何创建 SearchResponse class 的实例(没有 public 构造函数)?
How to create an instance of SearchResponse class (which has no public constructors)?
我想模拟 returns 来自命名空间 System.DirectoryServices.Protocols 的 SearchResponse 对象的方法。我使用最小起订量。我需要创建它的实例。它没有任何构造函数。
通常在我的项目中,它是将 DirectoryResponse 对象转换为 SearchResponse class 的结果,其中 DirectoryReponse 是 LdapConnection 对象的 SendRequest 方法的结果。
有什么方法可以创建 SearchReponse 实例 class?
您可以使用 Typemock Isolator by faking SearchResponse
和 Members.CallOriginal 标志来确保调用原始实现。
*请确保在使用前设置状态为假货。
另一种方法是使用FakeDependencies。 Isolator 自动为 ctors 参数创建伪造,传递它们和 returns 您的 class(SearchResponse) 的实例。您可以创建并将部分或全部依赖项传递给 FakeDependencies 方法,它会在创建时将它们委托给构造器。
示例:
class MyClass
{
public SearchResponse GetSearchResponse()
{
return null;
}
}
真实:
[TestMethod]
public void CreateSearchResponse_RealObjectWithFakedDependencies()
{
var myClass = new MyClass();
SearchResponse searchResponse = Isolate.Fake.Dependencies<SearchResponse>();
Isolate.WhenCalled(() => myClass.GetSearchResponse()).WillReturn(searchResponse);
SearchResponse sr = myClass.GetSearchResponse(); // returns SearchResponse
//...
}
假货:
[TestMethod]
public void CreateSearchResponse_FakeObject_StateShouldBeSet_OriginalBehavior()
{
var myClass = new MyClass();
SearchResponse fakeSearchResponse = Isolate.Fake.Instance<SearchResponse>(Members.CallOriginal, ConstructorWillBe.Called);
Isolate.WhenCalled(() => myClass.GetSearchResponse()).WillReturn(fakeSearchResponse);
SearchResponse sr = myClass.GetSearchResponse(); // returns fakeSearchResponse
//...
}
我终于找到了解决方案,基于
public class SearchResponseBuilder
{
public static SearchResponse Build(string errorMessage)
{
var ctors = typeof (SearchResponse).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);
var neededCtor = ctors.First(
ctor =>
ctor.GetParameters().Count() == 5);
SearchResponse response = neededCtor.Invoke(new object[]
{
"distinguishedName",
null, // System.DirectoryServices.Protocols.DirectoryControl[]
null, // System.DirectoryServices.Protocols.ResultCode
errorMessage,
null // System.Uri[]
}) as SearchResponse;
return response;
}
}
我想模拟 returns 来自命名空间 System.DirectoryServices.Protocols 的 SearchResponse 对象的方法。我使用最小起订量。我需要创建它的实例。它没有任何构造函数。
通常在我的项目中,它是将 DirectoryResponse 对象转换为 SearchResponse class 的结果,其中 DirectoryReponse 是 LdapConnection 对象的 SendRequest 方法的结果。
有什么方法可以创建 SearchReponse 实例 class?
您可以使用 Typemock Isolator by faking SearchResponse
和 Members.CallOriginal 标志来确保调用原始实现。
*请确保在使用前设置状态为假货。
另一种方法是使用FakeDependencies。 Isolator 自动为 ctors 参数创建伪造,传递它们和 returns 您的 class(SearchResponse) 的实例。您可以创建并将部分或全部依赖项传递给 FakeDependencies 方法,它会在创建时将它们委托给构造器。
示例:
class MyClass
{
public SearchResponse GetSearchResponse()
{
return null;
}
}
真实:
[TestMethod]
public void CreateSearchResponse_RealObjectWithFakedDependencies()
{
var myClass = new MyClass();
SearchResponse searchResponse = Isolate.Fake.Dependencies<SearchResponse>();
Isolate.WhenCalled(() => myClass.GetSearchResponse()).WillReturn(searchResponse);
SearchResponse sr = myClass.GetSearchResponse(); // returns SearchResponse
//...
}
假货:
[TestMethod]
public void CreateSearchResponse_FakeObject_StateShouldBeSet_OriginalBehavior()
{
var myClass = new MyClass();
SearchResponse fakeSearchResponse = Isolate.Fake.Instance<SearchResponse>(Members.CallOriginal, ConstructorWillBe.Called);
Isolate.WhenCalled(() => myClass.GetSearchResponse()).WillReturn(fakeSearchResponse);
SearchResponse sr = myClass.GetSearchResponse(); // returns fakeSearchResponse
//...
}
我终于找到了解决方案,基于
public class SearchResponseBuilder
{
public static SearchResponse Build(string errorMessage)
{
var ctors = typeof (SearchResponse).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);
var neededCtor = ctors.First(
ctor =>
ctor.GetParameters().Count() == 5);
SearchResponse response = neededCtor.Invoke(new object[]
{
"distinguishedName",
null, // System.DirectoryServices.Protocols.DirectoryControl[]
null, // System.DirectoryServices.Protocols.ResultCode
errorMessage,
null // System.Uri[]
}) as SearchResponse;
return response;
}
}