2013-07-27 3 views
12

ich einige Implementierungen des Repository-Muster gesehen haben, sehr einfach und intuitiv, verknüpft Form andere Antworten hier in StackoverflowRepository Pattern und Unit-Tests aus dem Gedächtnis

http://www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C http://www.remondo.net/repository-pattern-example-csharp/

public interface IRepository<T> 
{ 
    void Insert(T entity); 
    void Delete(T entity); 
    IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate); 
    IQueryable<T> GetAll(); 
    T GetById(int id); 
} 

public class Repository<T> : IRepository<T> where T : class, IEntity 
{ 
    protected Table<T> DataTable; 

    public Repository(DataContext dataContext) 
    { 
     DataTable = dataContext.GetTable<T>(); 
    } 
... 

Wie kann ich funktioniert es aus dem Speicher, wenn Unit-Tests durchgeführt werden? Gibt es eine Möglichkeit, eine DataContext- oder Linq-Tabelle aus einem beliebigen Speicher zu erstellen? Meine Idee war, eine Sammlung (Liste, Wörterbuch ...) zu erstellen und sie beim Komponententest auszugeben.

Danke!

EDIT: Was ich so etwas wie dieses brauchen:

  • Ich habe eine Klasse Buch
  • ich eine Klassenbibliothek
  • Im Library Konstruktor initialisieren ich das Repository:

    var bookRepository = new Repository<Book>(dataContext)

  • Und die Library Methoden verwenden das Repository, wie diese

    public Book GetByID(int bookID) 
    { 
        return bookRepository.GetByID(bookID) 
    } 
    

Beim Testen habe ich einen Speicherkontext zur Verfügung stellen möchten. Während der Produktion werde ich einen echten Datenbankkontext bereitstellen.

+0

ich einige Beispiel-Code nach Ihrer Anfrage hinzugefügt . –

Antwort

18

Ich würde vorschlagen, eine spöttische Bibliothek wie Moq oder RhinoMocks zu verwenden. Ein nettes Tutorial mit Moq finden Sie here.

Bevor Sie, welche entscheiden Sie verwenden, können die folgenden helfen:

Zusätzliche Informationen: Vergleich von Unit-Test-Framework kann gefunden werden.


UPDATEfolgende OP Antrag

a Erstellen Sie in Memory-Datenbank

var bookInMemoryDatabase = new List<Book> 
{ 
    new Book() {Id = 1, Name = "Book1"}, 
    new Book() {Id = 2, Name = "Book2"}, 
    new Book() {Id = 3, Name = "Book3"} 
}; 

Mock Repository (I Moq für das folgende Beispiel verwendet)

var repository = new Mock<IRepository<Book>>(); 

Richten Sie Ihren Repository

// When I call GetById method defined in my IRepository contract, the moq will try to find 
// matching element in my memory database and return it. 

repository.Setup(x => x.GetById(It.IsAny<int>())) 
      .Returns((int i) => bookInMemoryDatabase.Single(bo => bo.Id == i)); 

Bibliothek Objekt erstellen, indem Sie Ihre Mock-Objekt in Konstruktorparameter

var library = new Library(repository.Object); 

Und schließlich einige Tests vorbei:

// First scenario look up for some book that really exists 
var bookThatExists = library.GetByID(3); 
Assert.IsNotNull(bookThatExists); 
Assert.AreEqual(bookThatExists.Id, 3); 
Assert.AreEqual(bookThatExists.Name, "Book3"); 

// Second scenario look for some book that does not exist 
//(I don't have any book in my memory database with Id = 5 

Assert.That(() => library.GetByID(5), 
        Throws.Exception 
         .TypeOf<InvalidOperationException>()); 

// Add more test case depending on your business context 
..... 
+1

Vielen Dank für das Tutorial !. Aber ich muss eine vorhandene Klasse testen, die das Repository verwendet. Ein "falsches" Repository zu erstellen und es auf diese Weise zu testen, dient nur dazu, zu testen, ob das Repository-Muster gut implementiert ist. Ich werde versuchen, meine Frage zu klären, indem Sie es bearbeiten – Kaikus

+0

@Kaikus: Wenn Sie kurze Implementierung der Klasse mit Repository geben können, wäre es hilfreich –

+0

Also, wenn ich richtig verstehe, ist die Idee nicht, den 'Kontext' stub, aber das Repository komplett zu verspotten. Wenn ich dann eine Instanz instantiiere, muss ich immer ein eigenes Repository (das echte oder das falsche) mit dem Konstruktor einfügen. Vielen Dank! – Kaikus