У меня есть устаревший код и тесты для написания улучшений, которые я сделал в этом коде.У меня есть класс SiteSession и я извлек интерфейс ISiteSession, чтобы зависимость могла быть введена в вызывающий класс.
public class SiteSession : ISiteSession
{
public SiteSession(string userName, string externalRef, IePermitProAdapterClient ePermitService)
{
//.......
}
//...
}
В вызывающем классе есть конструктор, в котором зависимость вводится в контроллер CustomerDetails, который тестируется.
private readonly ICustomerDetails _customerDetails;
private ISiteSession _siteSession;
public SsoController(ICustomerDetails customerDetails, ISiteSession siteSession)
{
_customerDetails = customerDetails;
_siteSession = siteSession;
}
public ActionResult CustomerDetails(CustomerDetails customerDetails)
{
//.....
//...
//...
_siteSession = new SiteSession(customer.Username, customer.CustomerRef, ePermitService);
//.....
//...
//...
}
Теперь мой метод тестирования смоделировал зависимости, и у меня нет проблем ни с одним из тестов, созданных для этого контроллера или для любой другой части кода.Но когда тесты на этом контроллере CustomerDetails
вызваны, фактический вызов конструктора выполняется для класса SiteSession
, и я не могу ввести макет и прервать реальный вызов.Мой тестовый код выглядит следующим образом:
private Mock<ISiteSession> _siteSession;
В методе настройки теста: _siteSession = new Mock<ISiteSession>();
И в методе теста: _siteSession.Setup(x => x.Token).Returns("TestToken");
Я пробовал что-то вроде:
_siteSession = new Mock<SiteSession>(_customer.Object.Username, _customer.Object.CustomerRef, null);
Что, очевидно, неверно из-за разных типов преобразования, и я не могу придумать, как я могу смоделировать класс SiteSession, чтобы фактический конструктор не вызывался.Я использую NInject, NUnit и Moq