Проблема с модульным тестированием в .NET Core Razor-страницах - PullRequest
0 голосов
/ 20 марта 2019

В настоящее время я пишу юнит-тесты в xUnit для веб-приложения Razorpages.Чтобы сделать это, я смотрел, как это делается в документации Microsoft:

(https://docs.microsoft.com/en-us/aspnet/core/test/razor-pages-tests?view=aspnetcore-2.2)

Я все еще сталкиваюсь с проблемой, которая не очень многоимеет смысл для меня.

Я пытаюсь проверить мой метод OnGetAsync () на моей странице индекса администратора. Я пытаюсь проверить, представляет ли он все проекты в моей базе данных пользователю администратора.

Дело в том, что в этом примере все страницы OnGet загружают свои модели непосредственно для контекста базы данных, например:

OnGetAsync () метод страницы индекса из документов - работает

ProjectModel = await _context.GetProjectsAsync();

OnGetAsync () метод страницы индекса - это не работает

ProjectModel = await _context.ProjectModel.ToListAsync();

Странно, что метод из документа (_context.GetProjectsAsync) выглядит следующим образом:

public async virtual Task<List<ProjectModel>> GetProjectsAsync()
    {
        return await ProjectModel.AsNoTracking().ToListAsync();
    }

Так что, хотя результат должен быть точно таким же, а webapp работает нормально, мои модульные тесты не пройденыкак только вызывается метод OnGetAsync ().

Я искалисправление, по крайней мере, на несколько дней, можно сказать, что я застрял.Нужно ли писать все мои методы в _context. SomeMethod () , как в документации, или это можно сделать по-другому?Хотелось бы услышать некоторые предложения, спасибо!

Мой модульный тест

 [Fact]
    public async Task OnGetAsync_PopulatesTheAdminIndexPage_WithListOfProjects()
    {
        // Arrange
        var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>()
            .UseInMemoryDatabase("InMemoryDb");
        var mockAppDbContext = new Mock<ApplicationDbContext>(optionsBuilder.Options);
        var expectedProjects = ApplicationDbContext.GetSeedingProjects();    

        var mockEnvironment = new Mock<IHostingEnvironment>();
        mockEnvironment.Setup(m => m.EnvironmentName)
            .Returns("Hosting:UnitTestEnvironment");

        mockAppDbContext.Setup(db => db.GetProjectsAsync())
            .Returns(Task.FromResult(expectedProjects));

        var pageModel = new _123Dplatform.Pages.Admin.IndexModel(
            mockAppDbContext.Object,
            mockEnvironment.Object);

        // Act
        await pageModel.OnGetAsync();

        // Assert
        var actualMessages = Assert.IsAssignableFrom<List<ProjectModel>>(pageModel.ProjectModel);
        Assert.Equal(
        expectedProjects.OrderBy(m => m.ProjectName).Select(m => m.ProjectName), 
            actualMessages.OrderBy(m => m.ProjectName).Select(m => m.ProjectName));
    }   

Моя страница индекса администратора Метод OnGetAync:

public async Task OnGetAsync()
    {

    ProjectModel = await _context.ProjectModel.ToListAsync();

    }

Этоне работает, проблема вызывает:

       /* 
        Result StackTrace:	
   at Microsoft.EntityFrameworkCore.Utilities.Check.NotNull[T](T value, String parameterName)
   at Microsoft.EntityFrameworkCore.ModelExtensions.FindEntityType(IModel model, Type type)
   at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityType()
   at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityQueryable()
   at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.Microsoft.EntityFrameworkCore.Query.Internal.IAsyncEnumerableAccessor<TEntity>.get_AsyncEnumerable()
   at Microsoft.EntityFrameworkCore.Extensions.Internal.QueryableExtensions.AsAsyncEnumerable[TSource](IQueryable`1 source)
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)
   at _123Dplatform.Pages.Admin.IndexModel.OnGetAsync() in D:\GitHub\123D\123Dplatform\123Dplatform\Pages\Admin\Index.cshtml.cs:line 59
   at RazorPagesTestSample.Tests.UnitTests.AdminIndexPage.OnGetAsync_PopulatesTheAdminIndexPage_WithListOfProjects() in D:\GitHub\123D\RazorPagesTestSample.Tests\UnitTests\Admin\AdminIndexPageTest.cs:line 48
    --- End of stack trace from previous location where exception was thrown ---
    Result Message:	
    System.ArgumentNullException : Value cannot be null.
    Parameter name: model 
    */
...