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

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

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

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

【问题讨论】:

    标签: c# ldap mocking directoryservices


    【解决方案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://stackoverflow.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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-01
        相关资源
        最近更新 更多