вот все мои методы регистрации зависимостей в моем конструкторе базового класса тестов

я есть веб-приложение 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? Почему исключения не «появляются», как я ожидал бы при отладке теста, а код выхода по-прежнему равен нулю (как правило, указывает на успешное состояние возврата)?

Ответы на вопрос(3)

Ваш ответ на вопрос