В настоящее время я пишу юнит-тесты в 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
*/