Как я могу издеваться над простым методом, используя Moq Framework? - PullRequest
0 голосов
/ 03 марта 2019

Допустим, у меня есть простой метод, который проверяет, является ли переданное число четным, и возвращает логическое значение.Я новичок в насмешках и испытаниях.Как я могу издеваться над этим методом, используя Moq Framework?

public bool isEven(int x)
        {
            bool result = (x % 2 == 0) ? true : false;
            return result;
        }

1 Ответ

0 голосов
/ 03 марта 2019

Давайте предположим, что метод является частью интерфейса:

public interface IMyInterface
{
   bool isEven(int x);
}

что вы делаете, чтобы его смоделировать:

Mock<IMyInterface> myMock = new Mock<IMyInterface>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);

Что это значит, он настроит метод втаким образом, что независимо от значения, переданного в качестве аргумента, вернет true.

Затем вы можете передать этот макет другому классу / зависимости, например:

var myNewObject = new Whateverclass(myMock.Object)

Если ваш метод живет вконкретный класс, вы все еще можете это сделать, но вам нужно пометить ваш метод как virtual.В остальном процесс точно такой же.

Что Moq делает под ним, создает экземпляр своего собственного класса (например, прокси) и помещает возвращаемые значения для членов (методов, свойств), которые были настроены в методах настройки.

РЕДАКТИРОВАТЬ:

Конкретный пример:

public class MyClass
{
   public virtual bool isEven(int x) {
     return (x % 2 == 0);
   }
}

что вы делаете, чтобы сделать это:

Mock<MyClass> myMock = new Mock<MyClass>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);

var myNewObject = new Whateverclass(myMock.Object)

И, наконец, частичная реализация:

public class MyClass
{
   public virtual bool isEven(int x) {
         return (x % 2 == 0);
       }
   public bool OtherMethod() {
       return !isEven();
   }
}

Mock<MyClass> myMock = new Mock<MyClass>();
myMock.CallBase = true;
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);

var result = myMock.Object.OtherMethod();
...