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

时间:2015-07-08 14:25:19

标签: c# ldap mocking directoryservices

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

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

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

2 个答案:

答案 0 :(得分:3)

您可以Typemock Isolator使用faking [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 //... } 使用Members.CallOriginal标记执行此操作,以确保调用原始实现。

*确保在使用之前将状态设置为假。

另一种方法是使用FakeDependencies。隔离器自动为ctors参数创建伪造,传递它们并返回类的实例(SearchResponse)。您可以创建并将一些依赖项或所有依赖项传递给FakeDependencies方法,它会在创建时将它们委托给约束器。

示例:

[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

    //...
}

实时:

ROW(...)

假:

ARRAY[...]

答案 1 :(得分:0)

我终于找到了一个基于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;
    }
}