Как смоделировать зависимость внутри конструктора? - PullRequest
1 голос
/ 16 апреля 2020

Мне нужно протестировать функцию GetPollData (), и я написал класс Apitest, создал фиктивный объект этого класса и создал тестовый метод TestGetPollData (), который проверит, возвращаемое значение и ожидаемое значение равны или не равны
. Но я получаю возвращаемое значение как 20 вместо ожидаемого 10. Я отладил и проверил, что бизнес-объект, созданный в конструкторе класса API
, не проверяется, и эта зависимость возвращает значение, инициализированное в классе, а не проверенное значение что я хотел вернуть. Есть ли какой-нибудь способ, которым я могу издеваться над объектом, созданным внутри конструктора, или заставить Apitest работать так, как я ожидаю. Я использую nunit framework для тестирования. скажите пожалуйста что я сделал не так и что мне делать?

 public class API
     {  
        public Business business { get; set; }

        public API()
        {
           business=new Business();
        }

        public int GetPollData()
        {
           return business.polltime();
        }
      }

 public class Business
   {
        public int polltime()
        {
        return Service.poll;
        }
   }    

 public class Service
    {
    public int poll=20;
    }

//API TEST CLASS
 public class Apitest
     {
        private Mock<API> api = new Mock<API>();
        API ApiObj = new ApiObj();

        // Testing the GetPollData method 
        public TestGetPollData()
          {
           api.Setup( x => x.GetPollData()).Returns(10);
           int value=ApiObj.GetPollData();
           Assert.AreEqual(10,value);
          }
       }

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Существуют ограничения на то, что вы можете издеваться, используя Moq. Это более подробно описано здесь.

Могу ли я использовать moq Mock для насмешки над классом, а не интерфейсом?

Более привычно использовать Moq с интерфейсом или хотя бы абстрактным классом.

Я реорганизовал ваш код, чтобы API реализовывал интерфейс IAPI. Затем выполняется IAPI.

Я изменил ваш тестовый метод, чтобы вы вызывали метод GetPollData () из смоделированного объекта, а не из реального объекта.

Его также рекомендуется вводить Ваша зависимость от бизнес-класса в конструкторе для API, так что вы можете смоделировать это позже, если это будет необходимо. Я позволю тебе сделать это.

using Moq;
using NUnit.Framework;

namespace EntitlementServer.Core.Tests
{
    public interface IAPI
    {
        int GetPollData();
    }

    public class API : IAPI
    {
        public Business business { get; set; }

        public API()
        {
            business = new Business();
        }

        public int GetPollData()
        {
            return 20;
        }
    }

    public class Business
    {
        public int polltime()
        {
            return Service.poll;
        }
    }

    public static class Service
    {
        public static int poll = 20;
    }

    [TestFixture]
    public class Apitest
    {
        // Testing the GetPollData method 
        [Test]
        public void TestGetPollData()
        {
            var api = new Mock<IAPI>();
            api.Setup(x => x.GetPollData()).Returns(10);
            int value = api.Object.GetPollData();

            Assert.AreEqual(10, value);
        }
    }
}
0 голосов
/ 16 апреля 2020

Вы должны реорганизовать его, введя зависимость.

public class API { 
    public Business business { get; set; }

    public API( Business b )
    {
       business= b;
    }

    public int GetPollData()
    {
       return business.polltime();
    }
 }

В тесте передайте ваш смоделированный Business в API и проверьте, будет ли вызываться polltime смоделированного экземпляра.

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