2016-05-09 3 views
2

Привет Я пытаюсь настроить модульное тестирование контроллеров MVC 3, использующих Hangfire с использованием OWin. При нормальной работе, замедленное воспламенение получает сконфигурировано в функции конфигурации главного контроллера, как этотТестирование модуля MVC-приложения с помощью Hangfire

public void Configuration(IAppBuilder app) 
{ 
    var sCon = ConnectionString.GetConnectionString(); 
    try 
    { 
     IUnitOfWork oUoW = UnitOfWorkFactory.GetInstance(sCon); 
    } 
    catch (Exception ex) 
    { 
     Debug.WriteLine(ex.Message); 
     return; 
    } 
    app.UseHangfire(config => 
    { 
     config.UseSqlServerStorage(ConnectionString.GetConnectionString()); 
     config.UseServer(); 
    }); 
} 

Я настраиваю HttpContextBase используя Moq как этот

private static HttpContextBase FakeAuthenticatedHttpContext() 
{ 
    var context = new Mock<HttpContextBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    var response = new Mock<HttpResponseBase>(); 
    var session = new Mock<HttpSessionStateBase>(); 
    var server = new Mock<HttpServerUtilityBase>(); 
    var user = new Mock<IPrincipal>(); 
    var identity = new Mock<IIdentity>(); 
    var application = new Mock<HttpApplicationStateBase>(); 

    context.Setup(ctx => ctx.Request).Returns(request.Object); 
    context.Setup(ctx => ctx.Response).Returns(response.Object); 
    context.Setup(ctx => ctx.Session).Returns(session.Object); 
    context.Setup(ctx => ctx.Server).Returns(server.Object); 
    context.Setup(ctx => ctx.User).Returns(user.Object); 
    context.Setup(ctx => ctx.Application).Returns(application.Object); 
    user.Setup(ctx => ctx.Identity).Returns(identity.Object); 
    identity.Setup(id => id.IsAuthenticated).Returns(true); 
    identity.Setup(id => id.Name).Returns("admin"); 

    return context.Object; 
} 

moBaseController.SetFakeAuthenticatedControllerContext(); 

Как я фальшивый вызов конфигурации, чтобы настроить хранилище заданий? Я смотрел на документации замедленного воспламенения и они немного загадочные в этой области и отметить, что хранение задания должно быть установлено что-то вроде этого

GlobalConfiguration.Configuration.UseSqlServerStorage("<connection string or its name>"); 
using (new BackgroundJobServer()) 
{ 
    BackgroundJob.Enqueue(() => ProcessReport(oReportRequest, JobCancellationToken.Null))); 

} 

однако GlobalConfiguration не известен где-нибудь в тесте контроллера или блока.

Я использую Hangfire версии 1.1.1 и OWin 2.1.

Чтобы подвести итог, я ищу способ издеваться над средой вызова метода MVC 3, чтобы настроить хранилище заданий и фоновый сервер прозрачно. например, как я могу издеваться над контроллером, чтобы при вызове метода это было настроено.

Это, как правило, как я называю контроллер в тестовом модуле:

oViewResult = (ViewResult)moController.RunExport(oRequest); 

Assert.IsNotNull(oViewResult, "Didn't return a view result!"); 
Assert.IsTrue(oViewResult.ViewName == "RunReport", "Didn't return a valid view name!"); 
Assert.IsTrue(oViewResult.Model != null, "No Model response!"); 

var oResult = (string)oViewResult.Model; 
Assert.IsTrue(oResult == "Ok", "Export did not run as expected!"); 

Обычно, когда замедленное воспламенение называют это сделано, как это в контроллере

oTokens.Add(oReportStatus.ID, BackgroundJob.Enqueue(() => ProcessReport(oReportRequest, JobCancellationToken.Null))); 
+0

Пара вещей. Во-первых, «GlobalConfiguration» - это просто класс с кучей статических методов, я думаю, вы находите его в пространстве имен «Hangfire». Во-вторых, зачем вам нужно что-то делать с Hangfire? Наверняка вам просто нужно проверить свои методы работы. – DavidG

+0

Мне не нужно тестировать Hangfire, мне нужно протестировать контроллер. Способы, которые происходят, чтобы совершать вызовы в Hangfire, т. Е. Мне нужно отлаживать среду Hangfire, хранилище заданий, фоновый сервер и т. Д. – aggaton

+1

Вы [прочитали это] (http: /docs.hangfire.io/en/latest/background-methods/writing-unit-tests.html)? Вместо использования 'BackgroundJob.Enqueue()', вы должны захватить 'IBackgroundJobClient' с фабрики/DI объекта по вашему выбору вместо использования статических классов. То есть вы будете запускать 'IBackgroundJobClient bjc = GetJobClient(); bjc.Enqueue (...); 'Тогда вы просто издеваетесь над' IBackgroundJobClient'. – Rob

ответ

0

Размещение этого в качестве решения, согласно предложению Роба, я изменил все ссылки BackgroundJob.Enqueue() на IBackgroundJobClient bjc = GetJobClient(); bjc.Enqueue (...); и высмеивал IBackgroundJobClient, и смог получить тест, работающий таким образом.

+0

, но вы не можете использовать заданные по расписанию задания с помощью 'IBackgroundJobClient' .. – Esen

Смежные вопросы