Model у ActionResult равно Null
Пишу тесты для контроллеров на NUnit. Платформа .NetFramework 4.7.2. Возникла проблема, что ActionResult не возвращает передаваемую модель. А точнее возвращает её равной null. Отсюда и ошибка:
System.NullReferenceException : Ссылка на объект не указывает на экземпляр объекта.
Код теста
[Test]
[TestCase("", "", "", false, TestName = "Empty Params")]
[TestCase("", "", "", true, TestName = "Archive")]
[TestCase("", "5", "", false, TestName = "Have Filial")]
[TestCase("", "-", "", false, TestName = "Have Bad Filial")]
[TestCase("", "", "1", false, TestName = "Have Reserv Level")]
[TestCase("", "", "-", false, TestName = "Have Bad Reserv Level")]
[TestCase("1", "", "", false, TestName = "Have Code")]
[TestCase("*", "", "", false, TestName = "Have Bad Code")]
public void SearchResultTest1(string code, string idFilial, string idReservLevel, bool isArchived)
{
var result = controller.SearchResult("", "", "", isArchived) as ViewResult;
var data = context.Testables
.Include(f => f.TestableFilial)
.Include(f => f.TestableReservLevel)
.Where(t => t.isArchived == isArchived);
if (code != "") data = data.Where(t => t.TestableCode.Contains(code));
if (idFilial != "")
{
int int_idFilial = Convert.ToInt32(idFilial);
data = data.Where(t => t.TestableFilial.FilialId == int_idFilial);
}
if (idReservLevel != "")
{
int int_idReservLevel = Convert.ToInt32(idReservLevel);
data = data.Where(t => t.TestableReservLevel.ReservLevelId == int_idReservLevel);
}
int count = data.ToArray().Length;
Assert.IsInstanceOf<List<Testables>>(result.ViewData.Model);
Assert.AreEqual(count, (result.ViewData.Model as List<Testables>).Count);
}
Код ActionResult:
/// <summary>
/// Результаты поика тестируемых
/// </summary>
/// <param name="testableCode">Код тестируемого</param>
/// <param name="filialId">ИД филиала тестируемого</param>
/// <param name="reservLevelId">ИД уровня резерва тестируемого</param>
/// <param name="isArchived">Аккаунт тестируемого в архиве</param>
/// <returns>List<Testables></returns>
[HttpPost]
public ActionResult SearchResult(string testableCode,
string filialId,
string reservLevelId,
bool isArchived = false)
{
var tList = db.Testables//All testables eager loading
.Include(f => f.TestableFilial)
.Include(rl => rl.TestableReservLevel);
if (testableCode != null && testableCode != "")//Sort by code field
tList = tList.Where(t => t.TestableCode.Contains(testableCode));
if (filialId != null && filialId != "")//Sort by filial field
{
int FilialId = Convert.ToInt32(filialId);
tList = tList.Where(t => t.TestableFilial.FilialId == FilialId);
}
if (reservLevelId != null && reservLevelId != "")//Sort by reservLevel field
{
int ReservLevelId = Convert.ToInt32(reservLevelId);
tList = tList.Where(t => t.TestableReservLevel.ReservLevelId == ReservLevelId);
}
List<Testables> model = tList.Where(t => t.isArchived == isArchived).ToList();//Sort by archived
return PartialView(model);
}
Строка 62 - эта:
Assert.IsInstanceOf<List<Testables>>(result.ViewData.Model);
Ответы (1 шт):
Автор решения: Johannes Krauser III
→ Ссылка
Как и сказал @aepot , необходимо было поставить приведение к типу в скобках перед вызовом метода контроллера
var result = (ViewResult)controller.SearchResult("", "", "", isArchived);
Тогда у меня вывалилось исключение InvalidCastException. Не удалось привести тип PartialViewResult к ViewResult. Тогда оставалось поменять тип и всё заработало.
var result = (PartialViewResult)controller.SearchResult("", "", "", isArchived);
