Смоделируйте метод класса внутри action-result C#, используя moq и nunit - PullRequest
4 голосов
/ 10 февраля 2020

Я выполняю модульное тестирование контроллеров в моем asp. net основном проекте. В одном разделе есть код, подобный этому, создающий экземпляр объекта класса и вызывающий его метод.

public class ControllerNameController: ControllerBase{
    private IDependency _dependency;
    public ControllerNameController(IDependency dependency){
         _dependency = dependency
    }

       [HttpGet, Route("Get")]
        public ActionResult<dynamic> Get()
        {
            ......

            string someString = "abcd";
            ClassOne classOneObject = new ClassOne(_dependency);
            classOneObject.ClassOneMethod(someString);

            ..........

            return .....

        }
}

Я не могу смоделировать эту функцию. Как я могу это сделать?

1 Ответ

2 голосов
/ 10 февраля 2020

Вам придется изменить код. Одним из основных преимуществ модульного тестирования является не защита от ошибок, а помощь в написании более качественного кода.

ErrorLogHelper - это либо сервис, либо горизонтальный аспект.

Moq - это дизайн сделан для макетов интерфейсов или виртуальных методов. Для этого вам нужно как-то внедрить эту зависимость в целевой объект.

В этом случае вам нужно сделать это зависимостью службы, заставить ее реализовать интерфейс и внедрить ее через свойство или конструктор.

Встроенная инициализация означает, что код должен выполняться с модульным тестом, так как это неотъемлемая часть потока кода.

private IHostingEnvironment _hostingEnvironment;
public IErrorLogHelper logHelper
    public ControllerNameController(IHostingEnvironment hostingEnvironment, IErrorLogHelper logHelper){
         _hostingEnvironment = hostingEnvironment;
         this.logHelper = logHelper;
    }

И в вашем улове

catch (Exception ex)
            {

                string controllerInfo = controller.ActionDescriptor.DisplayName;
                logHelper.ErrorLogToFile(controllerInfo, ex);
            }
...