Используйте moq, чтобы игнорировать метод - PullRequest
0 голосов
/ 16 мая 2018

У меня есть метод GetBESummaries, который выглядит следующим образом:

public string GetBESummaries()
{
  CheckPermissions();

  /* rest of the code */
}

public void CheckPermissions()
{
   method1();
   method2();
 }

Я пишу метод модульного теста, используя moq, и я хочу, чтобы мой moq игнорировал CheckPermissions, чтобы я мог избежать насмешек над списком вызовов методов из Check Permissions. Я хочу, чтобы элемент управления не входил в метод CheckPermissions. Каков наилучший способ добиться этого?

1 Ответ

0 голосов
/ 16 мая 2018

На высоком уровне Moq работает, переопределяя реализацию для абстрактных и виртуализированных членов. Вам нужно будет разбить логику разрешений на абстрактный класс или интерфейс, чтобы она могла быть переопределена. Пока вы это делаете, подумайте о том, чтобы придать ему тип возвращаемого значения, чтобы вы могли что-то сделать с логикой проверки разрешений вне класса разрешений. Ваш основной класс может затем потребовать объект полномочий в своем конструкторе. Например,

public interface IPermissionsChecker
{
    bool UserHasPermissions( // whatever parameters you need );
}

public class PermissionsChecker : IPermissionsChecker
{
    public override bool UserHasPermissions( // same params as above)
    {
        // logic
    }
}

Как только вы там, издеваться очень легко. Вы просто создаете макет, пишете логику установки того, как вы хотите, чтобы он вел себя внутри ваших тестов, и вводите его в свой потребительский класс. Это дает дополнительный бонус улучшения вашей инкапсуляции: если вы хотите иметь разные методы подтверждения прав доступа, это просто вопрос отправки другого вашего конструктора или вызова метода!

var myMock = new Mock<IPermissions>();
myMock.Setup( m => m.UseHasPermissions()).Returns(true);

var classUnderTest = new GenericConsumerClass(myMock);
...