Для модульного теста я использую moq для макета HttpServerUtilityBase, присоединенного к HttpContextBase. Это связано с тем, что когда тестируемая функция может вызывать context.server (ASP.Net).
Однако, когда тестируемый метод выполняет context.server.transfer, при выполнении в приложении это приводит к остановке выполнения функции (вызываемой в httphandler). В моей версии moq'd "передача" вызов выполняется, а затем выполнение продолжается.
Чтобы бороться с этим, я поместил операторы return после передачи, но они правильно определены как избыточные с помощью stylecop.
Могу ли я настроить свой Mock для принудительного возврата вызывающего метода?
Например, если мы тестируем такой метод:
public void ProcessRequest(HttpContextBase context, string username, Logger logger)
{
if (string.isNullOrEmpty(username))
{
logger.Warn("Blah Blah invalid username");
context.Server.Transfer("~/ErrorPage.aspx");
}
ETC...
}
Следующий код правильно проверит правильность действий с неверным именем пользователя.
[TestMethod]
public void ProcessRequestTest()
{
// Set up my mocks
var logger = new Mock<ILogger>();
logger.Setup(l => l.Warn(It.IsAny<string>());
var context = new Mock<HttpContextBase>();
var server = new Mock<HttpServerUtilityBase>();
context.Setup(c => c.Server).Returns(server.Object);
// Try an invalid call
var rh = new MyRequestHandler();
rh.ProcessRequest(context.Object, string.empty, logger.Object);
// Check that the message was logged and the transfer was made
logger.Verify(l => l.Warn(It.IsRegex("invalid username"));
server.Verify(s => s.Transfer(It.IsAny<string>()));
}
Однако из-за того, что context.Server является поддельным, Transfer не остановит выполнение ProcessRequest, и пока я не введу возврат после передачи, тест будет выполнен после блока «ETC ...».