如何创建 SearchResponse 类的实例(没有公共构造函数)?

Posted

技术标签:

【中文标题】如何创建 SearchResponse 类的实例(没有公共构造函数)?【英文标题】:How to create an instance of SearchResponse class (which has no public constructors)? 【发布时间】:2015-09-26 12:53:24 【问题描述】:

我想模拟一个从命名空间 System.DirectoryServices.Protocols 返回 SearchResponse 对象的方法。我使用最小起订量。我需要创建它的实例。它没有任何构造函数。

通常在我的项目中,它是将 DirectoryResponse 对象转换为 SearchResponse 类的结果,其中 DirectoryReponse 是 LdapConnection 对象的 SendRequest 方法的结果。

有没有办法创建 SearchReponse 类的实例?

【问题讨论】:

【参考方案1】:

您可以使用 Typemock Isolator by faking SearchResponse 和 Members.CallOriginal 标志来确保调用原始实现。

*确保在使用之前设置你的假货状态。

另一种方法是使用FakeDependencies。隔离器自动为 ctors 参数创建假货,传递它们并返回您的类的实例(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

    //...

【讨论】:

【参考方案2】:

终于找到了解决办法,基于https://***.com/a/29939664/902792

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;
    

【讨论】:

以上是关于如何创建 SearchResponse 类的实例(没有公共构造函数)?的主要内容,如果未能解决你的问题,请参考以下文章

创建内部类的实例如何工作?

Elasticsearch 可以流式传输 SearchResponse 吗?

如何创建 HttpRequestHeaders 类的实例

如何创建基本字符类的实例

如何修复“无法创建 ViewModel 类的实例”?

如何创建自定义元素扩展类的新实例