Работа с переменными TempData в модульных тестах - PullRequest
0 голосов
/ 09 января 2020

Следуя приведенному ниже примеру:

Обработка данных TempD в ASP. NET Ядро в MSTest ,

Я записал следующий TestMethod:

[Fact]
public void TestBackMethod()
{
    var httpContext = new DefaultHttpContext();
    var tempData = new TempDataDictionary(httpContext, Mock.Of<ITempDataProvider>());
    tempData["id"] = 3008;
    var controller = new PhaseController(Configuration)
    {
        TempData = tempData
    }; 
    var result = controller.Back() as ViewResult;
    Assert.Contains("Index", result.ViewName);
}

Для этого метода контроллера:

public IActionResult Back()
{
    int releaseId = (int)TempData["id"];
    return RedirectToAction("Index", "Phase", new { id = releaseId });
}

Однако в этой строке:

Assert.Contains("Index", result.ViewName);

result равно null.

'Ссылка на объект не установлена ​​для экземпляра объекта.'

Почему это происходит и как я могу это исправить?

1 Ответ

2 голосов
/ 09 января 2020

Поскольку Back не возвращает ViewResult - он возвращает RedirectToActionResult (вы можете навести курсор на RedirectToAction, чтобы увидеть точное имя объекта). Оба они реализуют IActionResult.

. Вы получаете исключение Null Reference, потому что, когда вы используете ключевое слово as для приведения объектов, оно вернет null, если преобразование невозможно.

Если бы вместо этого у вас было

var result = (ViewResult)controller.Back();

Во время выполнения этой строки вы получите исключение разницы, говорящее о том, что преобразование невозможно.

Вы должны выполнить преобразование, выполнив один из этих методов:

var result = (RedirectToActionResult)controller.Back();

или

var result = controller.Back() as RedirectToActionResult;
...