Как смоделировать метод, который возвращает int с MOQ - PullRequest
4 голосов
/ 18 октября 2010

У меня есть класс, который выполняет извлечение содержимого, и у него есть метод, который требует некоторых входных данных (фильтров) перед его извлечением.Один из «input» вызывает другой метод, который, в основном, возвращает int, как мне его сменить, используя MOQ?Вот пример:

namespace MyNamespace
{
    public class ConfigMetaDataColumns : MyModel
    {
        public int FieldID { get { return ValueInt("FieldID"); } }
        public int OrderId { get { return ValueInt("OrderId"); } }
        public string Label { get { return ValueString("Label"); } }
        public string FieldName { get { return ValueString("FieldName"); } }
        public int IsReadOnly { get { return ValueInt("IsReadOnly"); } }
    }

    public class GetDataClass
    {
        protected OpenSQLAccessLayer m_WITObject;

        // Input Properties
        public string GroupID;
        public string PageName;

        // Output Properties

        /// <summary>
        /// Get Config meta data
        /// </summary>
        /// <returns></returns>
        public IEnumerable<ConfigMetaDataColumns> GetConfigMetaData()
        {
            var requester = new ListRequester<OpenSQL, ConfigMetaDataColumns>(m_WITObject, "Result[0].RowCount", "Result[0].Row[{0}].");

            return requester.Items;
        }

        public void InitRequest()
        {
            User user = (User)HttpContext.Current.User;
            m_WITObject = user.NewService<OpenSQLAccessLayer>();

            m_WITObject.SetInput("MultipleResultSets", 1);
            m_WITObject.SetInput("ClientID", Utils.GetClientID());
            m_WITObject.SetInput("GroupID", GroupID);
            m_WITObject.SetInput("PageName", PageName);
            m_WITObject.Retrieve();
        }
    }
}

Это метод "GetClientID ()":

public static int GetClientID()
        {
            User oUser = (User)HttpContext.Current.User;
            int nClientID;
            string sClientID = string.Empty;

            if (String.IsNullOrEmpty(oUser.Session("clientid")))
            {
                Client oClient = new Client();
            }

            oUser = (User)HttpContext.Current.User;
            sClientID = oUser.Session("clientid");




            //If we couldn't retrieve it, throw exception
            if ( string.IsNullOrEmpty(sClientID) || !int.TryParse(sClientID, out nClientID))
            {
                throw new Exception("No clientid found in user session, client not authenticated, please login from main page");
            }

            return nClientID;
        }

Я просто ищу способ передать жестко закодированное значениедля ClientID, и используйте это, чтобы выполнить некоторое модульное тестирование с классом GetDataClass .

Спасибо.

1 Ответ

5 голосов
/ 18 октября 2010

Нельзя издеваться над статическим методом.Вы должны использовать некоторые средства внедрения зависимости.Допустим, вы делаете свой метод GetClientId частью интерфейса с именем IUtils примерно так:

public interface IUtils
{
    int GetClientId();
} 

И ваш конкретный класс Utils реализован, как указано выше, но без статического метода (и реализации).интерфейс конечно).Теперь вы внедряете реализацию вашего интерфейса в класс GetDataClass, изменяя его конструктор, например:

public class GetDataClass
{
     private readonly IUtils utils;

     public GetDataClass(IUtils utils)
     {
         this.utils = utils;
     }

     //SNIP
}

В методе InitRequest вы меняете вызов Utils.GetClientID() на this.utils.GetClientId().

Теперь вы готовы создать экземпляр своего класса GetDataClass с помощью насмешки, например:

var utilsMock = new Mock<IUtils>();
utilsMock.Setup(u => u.GetClientId()).Returns(42);

var getDataClass = new GetDataClass(utilsMock.Object);
getDataClass.InitRequest();

И все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...