Jak Mock IGetMappingResponse ElasticSearch hnízdo na testování Unit

hlasů
3

Já a mí vysoké školy mají vestavěný modul datový přístup, které dělá CRUD a vyhledávací operace s databází ElasticeSearch (6.2.0) NoSQL. Použili jsme NEST (6.2.0), klienta vysoké úrovni mapovat dotazu DSL ElasticSearch. Modul byl kódován v C #, v knihovně třídy cíleným rámci .NET Standardní 2,0.

U některých metod je nutné získat mapování indexu indexů uložených v ElasticSearch takže informační pole, jako jsou typy polí a vlastnosti textu mohou být použity k vytvoření vyhledávacích dotazů do databáze ElasticSearch. Jsme schopni to udělat pomocí metody GetMapping hnízdo je (vrací Nest.IGetMappingResponse).

Nejsme potíže spouštění kódu. Vše funguje. Nicméně, když jdeme k vybudování jednotky test pro metody, které používá metodu GetMapping, nejsme schopni mock-up reakci se vrací (IGetMappingResponse). Původně jsem používá FakeItEasy předstírat ji, a pak se vloží některé údaje jsem potřeboval v objektu. Aby však bylo možné vysvětlit svůj problém, o něco lépe, jsem vytvořil třídu, která implementuje IGetMappingResponse zesměšňovat moji odpověď. Problém nastává, když se snažím vytvořit instanci TypeMappings pro mapování majetku IndexMapping (na oplátku je na vlastnictví indexy pro modelovou). I Get dluh rčení „‚TypMappings‘neobsahuje konstruktor, který trvá 0 argumentů.

public class MockedGetMappingResponse : IGetMappingResponse
    {
        public IReadOnlyDictionary<IndexName, IndexMappings> Indices
        {
            get
            {
                return new ReadOnlyDictionary<Nest.IndexName, Nest.IndexMappings>(new Dictionary<Nest.IndexName, Nest.IndexMappings>
                {
                    [statuses] = new IndexMappings
                    {
                        Mappings = new TypeMappings() //Error happens here!!
                    }                      

                });
            }
            set { }
        }

        public IReadOnlyDictionary<IndexName, IndexMappings> Mappings
        {
            get
            {
                return null;
            }
            set { }
        }

        public void Accept(IMappingVisitor visitor)
        {
            // Just a test
        }

        public bool IsValid
        {
            get
            {
                return true;
            }
        }

        public ServerError ServerError
        {
            get
            {
                return null;
            }
        }

        public Exception OriginalException
        {
            get
            {
                return null;
            }
        }

        public string DebugInformation
        {
            get
            {
                return ;
            }
        }

        public IApiCallDetails ApiCall
        {
            get
            {
                return null;
            }
            set
            {
                //do nothing
            }
        }

        public bool TryGetServerErrorReason(out string reason)
        {
            reason = ;
            return false;
        }
    }      

}

Když jsem se podívat do definice pro typ Nest TypeMappings nevidím konstruktor postavený. Z tohoto důvodu se domnívám, že by se mělo používat jako výchozí, konstruktor bez argumentů. Ale zřejmě se tak nestane. Musím vědět, jak jít o výsměch TypeMappings v IGetMappingResponse. Pokud není žádný způsob, jak vytvořit instanci TypeMappings, musím vědět, jak vytvořit vysmívali IGetMappingResponse mé očekávané odpovědi, takže mohu otestovat svůj kód.

Položena 27/11/2018 v 17:59
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

S Nkosi nápovědou jsem zjistil, že TypeMappings má vnitřní konstruktor. S vědomím, že jsem vytvořil instanci TypeMappings s využitím odrazu. Zde je kód jsem použil k vytvoření objektu.

IReadOnlyDictionary<TypeName, TypeMapping> backingDictionary = new ReadOnlyDictionary<TypeName, TypeMapping>(new Dictionary<TypeName, TypeMapping>
        {
            [typeName.Name] = typeMapping

        });           

        Type[] typeMappingsArgs = new Type[] { typeof(IConnectionConfigurationValues), typeof(IReadOnlyDictionary<TypeName, TypeMapping>) };
        object[] typeMappingsInputParams = new object[] { elasticClient.ConnectionSettings, backingDictionary };
        TypeMappings typeMappings = (TypeMappings)typeof(TypeMappings).GetConstructor(
              BindingFlags.NonPublic | BindingFlags.Instance,
              null, typeMappingsArgs, null).Invoke(typeMappingsInputParams);

Zde je kód pro vytvoření mé vysmívali IGetMappingResponse. Použil jsem FakeItEasy vložit nějaké informace.

private Nest.IGetMappingResponse GetFakeMappingResponse(Nest.IElasticClient elasticClient)
    {
        var fieldName = "fieldName";
        var indexName = "indexName";
        var documentTypeName = "documentTypeName";

        var typeMapping = new TypeMapping();
        var properties = new Properties();
        typeMapping.Properties = properties;

        var property = new TextProperty();
        property.Name = fieldName;            

        PropertyName propertyName = new PropertyName(fieldName);

        typeMapping.Properties.Add(propertyName, property);

        Type[] typeNameArgs = new Type[] { typeof(string) };
        object[] typeNameInputParams = new object[] { documentTypeName };
        TypeName typeName = (TypeName)typeof(TypeName).GetConstructor(
              BindingFlags.NonPublic | BindingFlags.Instance,
              null, typeNameArgs, null).Invoke(typeNameInputParams);


        IReadOnlyDictionary<TypeName, TypeMapping> backingDictionary = new ReadOnlyDictionary<TypeName, TypeMapping>(new Dictionary<TypeName, TypeMapping>
        {
            [typeName.Name] = typeMapping

        });           

        Type[] typeMappingsArgs = new Type[] { typeof(IConnectionConfigurationValues), typeof(IReadOnlyDictionary<TypeName, TypeMapping>) };
        object[] typeMappingsInputParams = new object[] { elasticClient.ConnectionSettings, backingDictionary };
        TypeMappings typeMappings = (TypeMappings)typeof(TypeMappings).GetConstructor(
              BindingFlags.NonPublic | BindingFlags.Instance,
              null, typeMappingsArgs, null).Invoke(typeMappingsInputParams);

        IndexMappings indexMappings = new IndexMappings();
        typeof(IndexMappings).GetProperty("Mappings", BindingFlags.Public | BindingFlags.Instance).SetValue(indexMappings, typeMappings);

        ReadOnlyDictionary<Nest.IndexName, Nest.IndexMappings> indices = new ReadOnlyDictionary<Nest.IndexName, Nest.IndexMappings>(new Dictionary<Nest.IndexName, Nest.IndexMappings>
        {
            [indexName] = indexMappings

        });

        var fakeMappingResponse = A.Fake<IGetMappingResponse>();
        A.CallTo(() => fakeMappingResponse.ServerError).Returns(null);
        A.CallTo(() => fakeMappingResponse.IsValid).Returns(true);
        A.CallTo(() => fakeMappingResponse.Indices).Returns(indices);

        return fakeMappingResponse;
    }
Odpovězeno 28/11/2018 v 17:37
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more