Если для одной из зависимостей контроллера требуется, чтобы HttpContext.Current был доступен, вы не можете его напрямую смоделировать, но можете обернуть эту зависимость в саму тестируемую абстракцию.
Если мы предположим, что Realm
является виновником, вы должны сначала извлечь интерфейс из него:
public interface IRealm
{
// I don't know what the real AutoDetect property returns,
// so I just assume bool
bool AutoDetect { get; }
}
Вам, очевидно, потребуется реальная реализация IRealm:
public class RealmAdapter : IRealm
{
bool AutoDetect { get { return Realm.AutoDetect; } }
}
Вы должны ввести абстрактный IRealm в контроллер, например, с помощью Конструктор Injection
public class MyController
{
private readonly IRealm realm;
public MyController(IRealm realm)
{
if( realm == null)
{
throw new ArgumentNullException("realm");
}
this.realm = realm;
}
}
Теперь вы можете изменить реализацию метода LogOn, чтобы использовать this.realm
вместо того, чтобы полагаться непосредственно на класс Realm.
Теперь модульное тестирование сможет предоставить фиктивный экземпляр IRealm для контроллера:
var realmMock = new Mock<IRealm>();
var sut = new MyController(realmMock.Object);
(В этом примере используется Moq.)