2016-06-28 5 views
0

Ich entwickle ein ASP.NET MVC-Projekt. In meinem Projekt mache ich Unit Testing. Ich benutze Moq für Unit-Test. Aber ich habe ein Problem mit dem Testen einer Methode einer Modellklasse, die von einer anderen Funktion abhängig ist. Bitte sehen Sie mein Szenario unten. Wie die Funktionalität der Testklasse selbst mit Moq in ASP.NET MVC-Unit-Test zu verhöhnen

Dies ist die Stichprobe der Modellklasse, die ich

public class ItemRepo:IItemRepo 
{ 
    private DbContext context = new DbContext(); 

    public IEnumerable<Item> GetItems() 
    { 
     return context.items; 
    } 

    public string GenerateItemCode() 
    { 
     Item item = this.GetItems.OrderByDescending(x=>x.Id).FirstOrDefault(); 
     //do something 
     return itemCode; 
    } 
} 

ich GenerateItemCode wollen testen wollen Methode testen

[TestClass] 
    public class ItemRepoTests 
    { 
     [TestMethod] 
     public void GenerateItemCode_IncreaseDigit() 
     { 
      Item[] items = new Item[]{ 
       new Item{ 
        ItemCode = "DN999934" 
       } 
      }; 
      ItemRepo itemRepo = new ItemRepo(); 
      //I want to mock GetItems method here 
     } 
    } 

bemerkte ich, was ich in Testcode verspotten wollen. Wie kann ich diese Methode verspotten? Wie kann ich die Abhängigkeitsfunktion dieser Methode testen?

+0

Wie wird 'Elemente' in das Modell eingeführt . Wird es intern erstellt oder in die Klasse injiziert? – Nkosi

+0

Der Code in der GetItems-Methode in dieser Frage ist ziemlich wichtig, bitte können Sie es hinzufügen, wie Sie uns zeigen, wie Sie Daten aus der Datenbank erhalten. Wenn Sie beispielsweise EF DbContext verwenden, können Sie vorschlagen, dass Sie einen Mock-DbContext injizieren, um Unit-Tests auszuführen. – uk2k05

+0

GetItems Methode ist nur Rückkehr context.Items –

Antwort

2

Sie erwähnt in Ihr Kommentar, dass Sie Elemente aus einer Kontextklasse erhalten. Dies ist die Klasse, die Sie verspotten müssen.

Es gibt viele Artikel rund um den erklären, wie auf einer Google-Suche einen DbContext, Top-Ergebnis verspotten How to mock DbContext and DbSet with Moq for unit testing?

[TestClass] 
public class ItemRepoTests 
{ 
    [TestMethod] 
    public void GenerateItemCode_IncreaseDigit() 
    { 
     Item[] items = new Item[]{ 
       new Item{ 
          ItemCode = "DN999934" 
         } 
     }; 

     var mockContext = new Mock<YourContext>(); 
     // Code to inject items into mock context 

     // You may have to implement the context injection into your ItemRepo 
     // class if you do not already have it 

     ItemRepo itemRepo = new ItemRepo(mockContext.Object); 

     var result = itemRepo.GenerateItemCode(); 

     // Code to check result is correct 
    } 
} 

Also im Grunde Sie einen Mock DbContext in Ihrem Unit-Test erstellen und in einer gefälschten Liste übergeben oder solche der Artikeldaten. Dann injizieren Sie diesen Mock in die Klasse, die Sie testen, führen Sie den Test aus, und wenn alles gut und gut mit Ihrem Code ist, wird das richtige Ergebnis am anderen Ende ausgegeben

+0

Ich habe meine vorherigen Kommentare gelöscht. Das Problem ist das falsche IDbSet. Aber mein Kontext mit DbSet. Ich kann mit DbSet nicht spotten. Also habe ich alle IDbSet in meiner Kontextklasse für Entitäten geändert. Aber wenn ich zu IDbSet wechsel, gibt es Funktionen, die removeRange mit Items verwenden. Daher kann ich removeRange nicht zu IDbSet verwenden. Also bitte eine Idee? –

+0

Ich verwende removeRange für bessere Leistung. –

0

ersetzen die GetItems mit einem Delegierten:

public class ItemRepo : IItemRepo 
{ 
    public Func<System.Collections.Generic.IEnumerable<Item>> Items =() => 
     { // all your orignal code 
      return items; 
     }; 

     public string GenerateItemCode() 
     { 
     Item item = Items().OrderByDescending(x => x.Id).FirstOrDefault(); 
     //do something 
     return itemCode; 
     } 
} 

im Testcode Ihre Stellvertretung Replace:

public class ItemRepoTests 
{ 
    [TestMethod] 
    public void GenerateItemCode_IncreaseDigit() 
    { 
     Item[] items = new Item[]{ 
      new Item{ 
       ItemCode = "DN999934" 
      } 
     }; 
     ItemRepo itemRepo = new ItemRepo(); 
     itemRepo.Items =() => items; 
     //I want to mock GetItems method here 

     itemRepo.GenerateItemCode() 
    } 
    } 

Pseudo-Code nicht getestet, nur die Idee zu beschreiben

+0

Kann ich vollständigen Code bekommen? Weil ich nicht klar bin. –

+0

Wenn ich Delegat verwende, kann ich nicht auf andere Eigenschaften der getesteten Klasse innerhalb der Delegate-Funktion zugreifen. –

Verwandte Themen