Это должен был быть принятый ответ
вожу юнит-тестирование, чтобы узнать, вызван ли метод.
[Fact]
public void Can_Save_Project_Changes()
{
//Arrange
var user = new AppUser() { UserName = "JohnDoe", Id = "1" };
Mock<IRepository> mockRepo = new Mock<IRepository>();
Mock<UserManager<AppUser>> userMgr = GetMockUserManager();
userMgr.Setup(x => x.FindByNameAsync(It.IsAny<string>())).ReturnsAsync(new AppUser() { UserName = "JohnDoe", Id = "1" });
var contextUser = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.NameIdentifier, user.Id),
}));
Mock<ITempDataDictionary> tempData = new Mock<ITempDataDictionary>();
ProjectController controller = new ProjectController(mockRepo.Object, userMgr.Object)
{
TempData = tempData.Object,
ControllerContext = new ControllerContext
{
HttpContext = new DefaultHttpContext() { User = contextUser }
}
};
Project project = new Project()
{
Name = "Test",
UserID = "1",
};
//Act
Task<IActionResult> result = controller.EditProject(project);
//Assert
mockRepo.Setup(m => m.SaveProject(It.IsAny<Project>(), user));
//This line still throws an error
mockRepo.Verify(m => m.SaveProject(It.IsAny<Project>(), user));
Assert.IsType<Task<IActionResult>>(result);
var view = result.Result as ViewResult;
Assert.Equal("ProjectCharts", view.ViewName);
Assert.Equal("Project", view.Model.ToString());
}
Во время отладки я могу убедиться, что метод на самом деле вызывается в контроллере,
//This controller line is touched walking through the code
repository.SaveProject(project, user);
//but this repo line is not touched
public void SaveProject(Project project, AppUser user)
Отладка на самом деле не показывает вход в метод репозитория. Точная ошибка ниже
Ожидаемый вызов на макет хотя бы один раз, но так и не был выполнен: m => m.SaveProject (, JohnDoe)
Настройки не настроены. Выполненные вызовы: IRepository.ProjectClass IRepository.SaveProjects (ProjectClass, JohnDoe) '
Когда я делаю реальный интеграционный тест,SaveProject
Метод затрагивается в хранилище и, кажется, работает правильно. Я также пытался назначить каждыйProject
свойство в модульном тесте, но получил тот же результат ошибки