2016-04-14 16 views
2

Ich benutze Microsoft Fakes, um eine asynchrone Methode zu shimmen, die eine andere Methode aufruft, um einen implementierten DbContext zu erhalten. Da die Datenbankverbindungszeichenfolge nicht im Komponententest bereitgestellt wird, während die Methode, die innerhalb der asynchronen Methode aufgerufen wird, sie benötigt. Shim überspringt nicht nur die Methode, die die Verbindungszeichenfolge verwendet, sondern gibt auch einen anpassbaren DbContext zurück.Wie Verwenden von Microsoft-Fehlern zu Shim Async-Task-Methode?

Hier ist die aysnc Methode Umsetzung:

public async Task<AccountDataDataContext> GetAccountDataInstance(int accountId) 
{ 
    var account = await this.Accounts.FindAsync(accountId); 

    return AccountDataDataContext.GetInstance(account.AccountDataConnectionString); 
} 

Allerdings bin ich mit Shim Asynchron-Methode nicht vertraut.

ConfigurationEntities.Fakes.ShimConfigurationDataContext.AllInstances.GetAccountDataInstanceInt32NullableOfInt32 = (x, y, z) => new Task<AccountDataEntities.AccountDataDataContext>(() => 
{ 
    return new SampleContext();// This is the fake context I created for replacing the AccountDataDataContext. 
}); 

Und SampleContext AccountDataDataContext setzt sich wie folgt: Was ich so aussahen

public class SampleContext: AccountDataDataContext 
{ 
    public SampleContext() 
    { 
     this.Samples = new TestDbSet<Sample>(); 

     var data = new AccountDataRepository(); 

     foreach (var item in data.GetFakeSamples()) 
     { 
      this.Samples.Add(item); 
     } 
    } 
} 

Unter dem Codeausschnitt für den Testfall ist:

[TestMethod] 
public async Task SampleTest() 
{ 
    using (ShimsContext.Create()) 
    { 
     //Arrange 
     SamplesController controller = ArrangeHelper(1);// This invokes the Shim code pasted in the second block and returns SamplesController object in this test class 

     var accountId = 1; 
     var serviceId = 2; 

     //Act 
     var response = await controller.GetSamples(accountId, serviceId);// The async method is invoked in the GetSamples(int32, int32) method. 

     var result = response.ToList(); 

     //Assert 
     Assert.AreEqual(1, result.Count); 
     Assert.AreEqual("body 2", result[0].Body); 
    } 
} 

Als Ergebnis Mein Testfall läuft für immer. Ich denke, ich könnte den Shim Lamdas Ausdruck völlig falsch schreiben.

Irgendwelche Vorschläge? Vielen Dank.

Antwort

1

Sie möchten keine zurückgeben. In der Tat, you should never, ever use the Task constructor. Wie ich in meinem Blog beschreibe, hat es überhaupt keine gültigen Anwendungsfälle.

Stattdessen verwenden Task.FromResult:

ConfigurationEntities.Fakes.ShimConfigurationDataContext.AllInstances.GetAccountDataInstanceInt32NullableOfInt32 = 
    (x, y, z) => Task.FromResult(new SampleContext()); 

Task auch mehrere andere From* Methoden, die für Einheitentests nützlich sind (z.B. Task.FromException).

+0

Es ist gut, über Task Constructor zu wissen, ich überprüfe nur einige Spezifikationen diesbezüglich und Sie haben Recht. Ich werde das Task.FromResult() morgen versuchen, wenn ich zu meinem Arbeitsplatz komme. Vielen Dank. –