Mock контекста при юнит тестировании
Проект ASP под .Net Framework Есть класс теста, тестирует методы HomeController : BaseController
HomeController использует поле _siteSecurityContext, а объявлено оно в BaseController Где и как оно инжектируется - не знаю, проект для меня новый и большой - навскидку в поиске по коду не нашёл
Что мне нужно: чтобы в момент вызова тестируемого метода из класса теста поле _siteSecurityContext был проинициализировано, но к этому моменту оно null. Пробовал "мокать" его по-разному с помощью фреймворка Moq - не помогает
class MethodXXXTest
{
private readonly _c;
MethodXXXTest()
{
_c = HomeController(_xService, _yService...... ещё 8 заинжектенных
сервисов)
}
public void CheckXXXTest()
{
///
///
///
_c.CheckXXX(/// - тестируемый метод
}
}
public class HomeController : BaseController
{
public HomeController()
{
// заинжектенные сервисы
}
public void CheckXXXTest()
{ // должно быть не null, сейчас null
_siteSecurityContext.Foo(...
}
}
public abstract class BaseController : Controller, ...
{
// тут он объявлен
protected SiteSecurityContext _siteSecurityContext {get; set;} -
инжектится непонятно где. его надо за мокать из класса теста
}
Ответы (1 шт):
Самый простой вариант, если найти место инжекта слишком тяжело, или если не хочется дергать дополнительную логику - паттерн Public Morozov под флагом Conditional:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Diagnostics;
namespace UnitTestProject1
{
public class HomeController : BaseController
{
public HomeController()
{
// заинжектенные сервисы
}
[Conditional("DEBUG")]
public void Debug_SetSecurityContext(SiteSecurityContext context)
{
_siteSecurityContext = context;
}
public void CheckXXXTest()
{ // должно быть не null, сейчас null
_siteSecurityContext.Foo();
}
}
public abstract class BaseController
{
// тут он объявлен
protected SiteSecurityContext _siteSecurityContext { get; set; }
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
// Arrange
var controller = new HomeController();
var context = new SiteSecurityContext();
controller.Debug_SetSecurityContext(context);
// Act
controller.CheckXXXTest();
// Assert
// TODO: проверить результаты вызова
}
}
}