2016-05-09 9 views
2

Hallo Ich versuche, Unit-Test für MVC 3-Controller, die Hangfire mit OWin verwenden testen. Im normalen Betrieb, wird in der Konfigurationsfunktion des Hauptreglers wie dieseUnit testet MVC app mit 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(); 
    }); 
} 

Ich Einrichtung Httpcontextbase mit Moq wie diese

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(); 

Wie fälschen ich den Anruf Konfiguration Hangfire konfiguriert den Jobspeicher einrichten? Ich habe an der Hangfire Dokumentation suchen und sie sind ein wenig kryptisch in diesem Bereich und soll erwähnen, dass Jobspeicher so etwas wie diese

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

} 

jedoch GlobalConfiguration bekannt ist, nicht überall in der Steuerung oder Unit-Test eingerichtet werden.

Ich benutze Hangfire Version 1.1.1 und OWin 2.1.

Zusammenfassend suche ich nach einer Möglichkeit, die Umgebung eines MVC 3 Methodenaufrufs zu verspotten, um Job Storage und Background Server transparent einzurichten. d. h. wie kann ich den Controller verspotten, so dass wenn die Methode aufgerufen wird, dies eingerichtet wurde.

Dies ist im Allgemeinen, wie ich den Controller in dem Unit-Test nennen:

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!"); 

Im Allgemeinen, wenn Hangfire es so in der Steuerung erfolgt genannt wird

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

Ein paar Dinge. Erstens, 'GlobalConfiguration' ist nur eine Klasse mit einer Reihe von statischen Methoden, ich denke, Sie finden es im 'Hangfire'-Namespace. Zweitens, warum musst du etwas mit Hangfire testen? Sicherlich müssen Sie nur Ihre Arbeitsmethoden testen. – DavidG

+0

Ich muss Hangfire nicht testen, ich muss Controller-Methoden testen, die Hangfire anrufen, dh ich muss die Hangfire-Umgebung, den Jobspeicher, den BackgroundServer usw. verstellen. – aggaton

+1

Hast du [dies gelesen] (http://docs.hangfire.io/en/latest/background-methods/writing-unit-tests.html)? Anstatt "BackgroundJob.Enqueue()" zu verwenden, sollten Sie "IBackgroundJobClient" aus der Objektfactory/DI Ihrer Wahl verwenden, anstatt die statischen Klassen zu verwenden. Das heißt, Sie würden 'IBackgroundJobClient bjc = GetJobClient() ausführen; bjc.Enqueue (...); 'Dann verspottet man einfach' IBackgroundJobClient'. – Rob

Antwort

0

Platzierung dies als die Lösung, Gemäß @ Robs Vorschlag habe ich alle BackgroundJob.Enqueue() - Verweise auf IBackgroundJobClient geändert bjc = GetJobClient(); bjc.Enqueue (...); und verspottete IBackgroundJobClient, und war in der Lage, den Test auf diese Weise arbeiten zu lassen.

+0

, aber Sie können keine wiederkehrenden Jobs mit "IBackgroundJobClient" verwenden. – Esen