вот все мои методы регистрации зависимостей в моем конструкторе базового класса тестов
я есть веб-приложение ASP.Net Core 2.0, которое я модернизирую с помощью модульных тестов (используя NUnit). Приложение работает нормально, и большинство тестов пока работают нормально.
Тем не менее, тестирование аутентификации / авторизации (пользователь входит в систему и может получить доступ[Authorize]
отфильтрованные действия) не удается с ...
System.ArgumentNullException: Value cannot be null.
Parameter name: provider
...после...
await HttpContext.SignInAsync(principal);
... но не ясно, что на самом деле является основной причиной. Выполнение кода останавливается в вызываемом методе здесь, и в IDE не отображается исключение, но выполнение кода возвращается к вызывающей стороне, а затем завершается (пока я все еще вижуThe program '[13704] dotnet.exe' has exited with code 0 (0x0).
в окне вывода VS.)
Тестовый проводник показывает красный цвет и выдает исключение, на которое ссылаются (в противном случае я бы понятия не имел о проблеме).
Я работаю над созданием репрограммы, на которую будут указывать ребята (пока что я немного занят).
Кто-нибудь знает, как определить причину? Является ли это проблемой, связанной с DI (что-то нужно, что не предусмотрено в тесте, но находится в нормальном исполнении)?
Update1: Предоставление запрошенного кода аутентификации ...
public async Task<IActionResult> Registration(RegistrationViewModel vm) {
if (ModelState.IsValid) {
// Create registration for user
var regData = createRegistrationData(vm);
_repository.AddUserRegistrationWithGroup(regData);
var claims = new List<Claim> {
new Claim(ClaimTypes.NameIdentifier, regData.UserId.ToString())
};
var ident = new ClaimsIdentity(claims);
var principal = new ClaimsPrincipal(ident);
await HttpContext.SignInAsync(principal); // FAILS HERE
return RedirectToAction("Welcome", "App");
} else {
ModelState.AddModelError("", "Invalid registration information.");
}
return View();
}
Тестовый код, который не проходит ...
public async Task TestRegistration()
{
var ctx = Utils.GetInMemContext();
Utils.LoadJsonData(ctx);
var repo = new Repository(ctx);
var auth = new AuthController(repo);
auth.ControllerContext = new ControllerContext();
auth.ControllerContext.HttpContext = new DefaultHttpContext();
var vm = new RegistrationViewModel()
{
OrgName = "Dev Org",
BirthdayDay = 1,
BirthdayMonth = "January",
BirthdayYear = 1979
};
var orig = ctx.Registrations.Count();
var result = await auth.Registration(vm); // STEPS IN, THEN FAILS
var cnt = ctx.Registrations.Count();
var view = result as ViewResult;
Assert.AreEqual(0, orig);
Assert.AreEqual(1, cnt);
Assert.IsNotNull(result);
Assert.IsNotNull(view);
Assert.IsNotNull(view.Model);
Assert.IsTrue(string.IsNullOrEmpty(view.ViewName) || view.ViewName == "Welcome");
}
Update3: На основечат @nkosiпредложенный что это проблема, связанная с тем, что я не выполняю требования внедрения зависимостей дляHttpContext
.
тем не мението, что еще не ясно, так это: если на самом деле это проблема не обеспечения правильной зависимости службы, почему код работает нормально (когда не тестируется). SUT (контроллер) принимает только параметр IRepository (так что это все, что предоставляется в любом случае.) Зачем создавать перегруженный ctor (или mock) только для проверки, когда существующий ctor - это все, что вызывается при запуске программы и это работает без проблем?
UPDATE4В то время как @Nkosi ответил на ошибку / проблему с помощью решения, я все еще задаюсь вопросом, почему в среде IDE нет точного / последовательного представления основного исключения. Это ошибка или из-за операторов async / await и NUnit Test Adapter / runner? Почему исключения не «появляются», как я ожидал бы при отладке теста, а код выхода по-прежнему равен нулю (как правило, указывает на успешное состояние возврата)?