Есть ли способ издеваться над поставщиками и типами Kentico, созданными для приложения mvc?

Я начинаю свой путь разработчика Kentico и создаю сайт MVC. Я хочу написать модульные тесты для моих классов Builder, но они полагаются на автоматически сгенерированные классы провайдеров, исходящие от Kentico. Кажется, что пакет Kentico.Libraries.Tests не будет работать с автоматически сгенерированными классами или типами поставщиков. Кто-нибудь знает возможно ли это?

Я следую приведенному здесь примеру: https://docs.kentico.com/k11/custom-development/writing-automated-tests/faking-info-and-provider-objects-in-unit-tests

Но не очень далеко ... из-за исключения, которое вызывает у меня некоторое замешательство. Код :

Fake<HomePage,HomePageProvider>();

выдает исключение:

The type 'CMS.DocumentEngine.Types.HomePage' cannot be used as type 
parameter 'TInfo' in the generic type or method 
'AutomatedTestsWithData.Fake<TInfo, TProvider>(TProvider, bool)'. 

There is no implicit reference conversion from 
'CMS.DocumentEngine.Types.HomePage' 
to 
'CMS.DataEngine.AbstractInfoBase<CMS.DocumentEngine.Types.HomePage>'.

Класс HomePage выглядит так:

//--------------------------------------------------------------------------------------------------
// <auto-generated>
//
//     This code was generated by code generator tool.
//
//     To customize the code use your own partial class. For more info about how to use and customize
//     the generated code see the documentation at http://docs.kentico.com.
//
// </auto-generated>
//--------------------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;

using CMS;
using CMS.Base;
using CMS.Helpers;
using CMS.DataEngine;
using CMS.DocumentEngine.Types;
using CMS.DocumentEngine;

[assembly: RegisterDocumentType(HomePage.CLASS_NAME, typeof(HomePage))]

namespace CMS.DocumentEngine.Types
{
    /// <summary>
    /// Represents a content item of type HomePage.
    /// </summary>
    public partial class HomePage : TreeNode
    {
        #region "Constants and variables"

        /// <summary>
        /// The name of the data class.
        /// </summary>
        public const string CLASS_NAME = "HomePage";


        /// <summary>
        /// The instance of the class that provides extended API for working with HomePage fields.
        /// </summary>
        private readonly HomePageFields mFields;

        #endregion


        #region "Properties"

        /// <summary>
        /// HomePageID.
        /// </summary>
        [DatabaseIDField]
        public int HomePageID
        {
            get
            {
                return ValidationHelper.GetInteger(GetValue("HomePageID"), 0);
            }
            set
            {
                SetValue("HomePageID", value);
            }
        }


        /// <summary>
        /// This heading shown in the breadcrumb.
        /// </summary>
        [DatabaseField]
        public string PageHeading
        {
            get
            {
                return ValidationHelper.GetString(GetValue("PageHeading"), @"");
            }
            set
            {
                SetValue("PageHeading", value);
            }
        }


        /// <summary>
        /// Header Image.
        /// </summary>
        [DatabaseField]
        public string HeaderImage
        {
            get
            {
                return ValidationHelper.GetString(GetValue("HeaderImage"), @"");
            }
            set
            {
                SetValue("HeaderImage", value);
            }
        }


        /// <summary>
        /// Header Image Alt Text.
        /// </summary>
        [DatabaseField]
        public string HeaderImageAltText
        {
            get
            {
                return ValidationHelper.GetString(GetValue("HeaderImageAltText"), @"");
            }
            set
            {
                SetValue("HeaderImageAltText", value);
            }
        }


        /// <summary>
        /// Title.
        /// </summary>
        [DatabaseField]
        public string HeaderTitle
        {
            get
            {
                return ValidationHelper.GetString(GetValue("HeaderTitle"), @"");
            }
            set
            {
                SetValue("HeaderTitle", value);
            }
        }


        /// <summary>
        /// Gets an object that provides extended API for working with HomePage fields.
        /// </summary>
        [RegisterProperty]
        public HomePageFields Fields
        {
            get
            {
                return mFields;
            }
        }


        /// <summary>
        /// Provides extended API for working with HomePage fields.
        /// </summary>
        [RegisterAllProperties]
        public partial class HomePageFields : AbstractHierarchicalObject<HomePageFields>
        {
            /// <summary>
            /// The content item of type HomePage that is a target of the extended API.
            /// </summary>
            private readonly HomePage mInstance;


            /// <summary>
            /// Initializes a new instance of the <see cref = "HomePageFields" /> class with the specified content item of type HomePage.
            /// </summary>
            /// <param name = "instance">The content item of type HomePage that is a target of the extended API.</param>
            public HomePageFields(HomePage instance)
            {
                mInstance = instance;
            }


            /// <summary>
            /// HomePageID.
            /// </summary>
            public int ID
            {
                get
                {
                    return mInstance.HomePageID;
                }
                set
                {
                    mInstance.HomePageID = value;
                }
            }


            /// <summary>
            /// This heading shown in the breadcrumb.
            /// </summary>
            public string PageHeading
            {
                get
                {
                    return mInstance.PageHeading;
                }
                set
                {
                    mInstance.PageHeading = value;
                }
            }


            /// <summary>
            /// Header Image.
            /// </summary>
            public string HeaderImage
            {
                get
                {
                    return mInstance.HeaderImage;
                }
                set
                {
                    mInstance.HeaderImage = value;
                }
            }


            /// <summary>
            /// Header Image Alt Text.
            /// </summary>
            public string HeaderImageAltText
            {
                get
                {
                    return mInstance.HeaderImageAltText;
                }
                set
                {
                    mInstance.HeaderImageAltText = value;
                }
            }


            /// <summary>
            /// Title.
            /// </summary>
            public string HeaderTitle
            {
                get
                {
                    return mInstance.HeaderTitle;
                }
                set
                {
                    mInstance.HeaderTitle = value;
                }
            }
        }

        #endregion


        #region "Constructors"

        /// <summary>
        /// Initializes a new instance of the <see cref = "HomePage" /> class.
        /// </summary>
        public HomePage() : base(CLASS_NAME)
        {
            mFields = new HomePageFields(this);
        }

        #endregion
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
339
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы попробовал поиграть с классами PageInfo и PageInfoProvider.

PageInfoProvider не работает для страниц ContentOnly (Kentico с 9 по 11)

Marnix van Valen 14.08.2018 10:57
Ответ принят как подходящий

Возможно, вы захотите посмотреть, как они проводили тесты для проекта MVC на GitHub здесь, и посмотреть, поможет ли это.

для других, которые находят этот вопрос, и если вы не хотите смотреть TLDR на github: используйте nuget Kentico.Libraries.Tests, сделайте свой тестовый класс расширенным от 'UnitTests'. затем используйте: Fake().DocumentType<Model>(Model.CLASS_NAME);

Timtek 11.10.2018 17:14

В дополнение к комментарию от @Timtek - вам нужно будет вызвать UnitTests.UnitTestsSetUp (); Это помогает настроить свойства инициализации Kentico при запуске модульных тестов.

cganickel 22.10.2020 18:12

Другие вопросы по теме