.NET CORE MVC ViewComponent xUnit Тестирование

Я начал использовать xUnit для примера проекта.NET CORE MVC, и я борюсь с добавлением тестов в ViewComponent который включает в себя IOptions а также IHostingEnvironment, Это простой компонент представления, который возвращает значения из файла appsettings.json, и это само по себе работает без проблем.

appsettings.json Фрагмент:

"Application": {"Name": "My App","Version": "1.0.0","Author": "John Doe", "Description": "Just a template!"}

ViewComponent:

[ViewComponent(Name = "Footer")]
public class FooterViewComponent : ViewComponent
{
    private readonly IOptions<AppSettings.Application> _app;
    private readonly IHostingEnvironment _env;

    public FooterViewComponent(IOptions<AppSettings.Application> app, IHostingEnvironment env)
    {
        _app = app;
        _env = env;
    }

    public IViewComponentResult Invoke()
    {
        var vm = new FooterViewModel();
        {
            vm.AppName = _app.Value.Name;
            vm.AppVersion = _app.Value.Version;
            vm.AppEnvironment = _env.EnvironmentName;
        }

        return View(vm);
    }
}

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

ViewComponent Test:

public class FooterViewComponentTest
{
    public class Should
    {
        [Fact]
        public void ReturnViewCompnentWithViewModel()
        {
            // Arrange
            var viewComp = new FooterViewComponent(??????????);

            // Act
            var result = viewComp ??????????;

            // Assert
            Assert.IsType<ViewComponentResult>(result);

        }
    }
}

Я все еще работаю над этим и буду редактировать мои фрагменты с моими выводами. У кого-нибудь есть предложения, и я должен писать тесты в этом формате?

1 ответ

Решение

С хорошо известной Moq Framework вы можете писать фиктивные объекты абстракций зависимостей и вставлять их в конструктор компонента следующим образом:

public class FooterViewComponentTest
{
    public class Should
    {
        [Fact]
        public void ReturnViewCompnentWithViewModel()
        {
            // Arrange
            var appSettings = new AppSettings.Application();
            appSettings.AppName = "app";
            appSettings.Version = "1.0";
            var optionsMock = new Mock<IOptions<AppSettings.Application>>();
            optionsMock.Setup(o => o.Value).Returns(appSettings);

            var hostingMock = new Mock<IHostingEnvironment>();
            hostingMock.Setup(h => h.Environment).Returns("Test");

            var viewComp = new FooterViewComponent(optionsMock.Object, hostingMock.Object);

            // Act
            var result = viewComp.Invoke();

            // Assert
            Assert.IsType<ViewComponentResult>(result);

        }
    }
}

Обратитесь к Moq Quickstart, чтобы получить более полное представление о том, как использовать фреймворк

Другие вопросы по тегам