На высоком уровне 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);