8 Stimmen

Dynamische Hinzufügung neuer Elemente zu einem hartkodierten gefälschten IQueryable-Repository

Bei der Erstellung einer Anwendung kann ich, bevor ich eine echte Datenbank verwende, zunächst eine hartkodierte Liste als Fake-Speicher verwenden, nur damit die Dinge funktionieren:

public class FakeProductsRepository 
{
    private static IQueryable<Product> fakeProducts = new List<Product> {
        new Product{ ProductID = "xxx", Description = "xxx", Price = 1000},
        new Product{ ProductID = "yyy", Description = "xxx", Price = 2000},
        new Product{ ProductID = "zzz", Description = "xxx", Price = 3000}
    }.AsQueryable();

    public IQueryable<Product> Products
    {
        get { return fakeProducts; }
    }
}

Wie kann man dieser Klasse eine Methode hinzufügen, mit der neue, nicht fest kodierte Einträge dynamisch in diese Liste eingefügt werden können?

15voto

dtb Punkte 205441

Behalten Sie einfach die Liste<Produkt> in einem Feld vom Typ Liste<Produkt> anstelle von IQueryable<Produkt>:

public class FakeProductsRepository 
{
    private readonly List<Product> fakeProducts = new List<Product>
    {
        new Product { ProductID = "xxx", Description = "xxx", Price = 1000 },
        new Product { ProductID = "yyy", Description = "xxx", Price = 2000 },
        new Product { ProductID = "zzz", Description = "xxx", Price = 3000 },
    };

    public void AddProduct(string productID, string description, int price)
    {
        fakeProducts.Add(new Product
        {
            ProductID = productID,
            Description = description,
            Price = price,
        });
    }

    public IQueryable<Product> Products
    {
        get { return fakeProducts.AsQueryable(); }
    }
}

5voto

Lazarus Punkte 39998

Wenn Sie Ihr Repository zu Testzwecken mocken wollen, sollten Sie damit beginnen, eine Schnittstelle zu deklarieren, die die Funktionen umfasst, die Sie von Ihrem Repository erwarten. Bauen Sie dann Ihr echtes und Ihr "gefälschtes" Repository so auf, dass sie diese Schnittstelle implementieren, da Sie sonst nicht in der Lage sein werden, das eine durch das andere zu ersetzen.

Sie werden feststellen, dass es ziemlich einfach ist, sobald Sie diese konsistente Schnittstelle haben, da die Funktionen bereits deklariert sind, d.h.

public interface IRepository {
    IQueryable<Products> GetAllProducts();
    Product AddProduct(Product Product);
}

public class FakeRepository : IRepository {
    private static IList<Product> fakeProducts = new List<Product> {
        new Product{ ProductID = "xxx", Description = "xxx", Price = 1000},
        new Product{ ProductID = "yyy", Description = "xxx", Price = 2000},
        new Product{ ProductID = "zzz", Description = "xxx", Price = 3000}
     };

     public IQueryable<Product> GetAllProducts() {
         return fakeProducts.AsQueryable();
     }

     public Product Add(Product Product) {
         fakeProducts.Add(Product);
         return Product;
     }
 }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X